android - Kotlin 与 JavaFXPorts 的兼容性
问题描述
我想用JavaFXPorts和 Kotlin 代码构建一个 JavaFX Android 应用程序。是否可以在 JavaFXPorts 项目中使用 Kotlin?这是我的示例 Gradle(版本 5.6.4)项目:
注意:此代码的问题是 Kotlin 运行时...有没有办法将所有内容捆绑在可执行 Jar 和 Apk 中?
.
├── app
│ ├── src
│ │ ├── android
│ │ │ └── AndroidManifest.xml
│ │ └── main
│ │ └── kotlin
│ │ └── com.example
│ │ └── App.kt
│ └── build.gradle.kts
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── build.gradle.kts
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
./settings.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
jcenter()
}
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.javafxports.jfxmobile") {
useModule("org.javafxports:jfxmobile-plugin:${requested.version}")
}
}
}
}
rootProject.name = "app"
include(":app")
./build.gradle.kts
plugins {
kotlin("jvm") version "1.3.61" apply false
id("org.javafxports.jfxmobile") version "1.3.18" apply false
}
allprojects {
repositories {
jcenter()
}
}
./app/build.gradle.kts
plugins {
kotlin("jvm")
id("org.javafxports.jfxmobile")
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
application {
mainClassName = "com.example.App"
}
jfxmobile {
android {
manifest = "src/android/AndroidManifest.xml"
applicationPackage = application.mainClassName
buildToolsVersion = "29.0.2"
compileSdkVersion = "28"
targetSdkVersion = "28"
minSdkVersion = "19"
}
}
./app/src/android/AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0">
<supports-screens android:xlargeScreens="true"/>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" android:maxSdkVersion="28"/>
<application android:label="App" android:name="android.support.multidex.MultiDexApplication">
<activity android:label="App" android:name="javafxports.android.FXActivity" android:configChanges="orientation|screenSize">
<meta-data android:name="main.class" android:value="com.example.App"/>
<meta-data android:name="debug.port" android:value="0"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
./app/src/main/kotlin/com/example/App.kt
@file:JvmName("App")
package com.example
import javafx.application.Application
import javafx.geometry.Rectangle2D
import javafx.scene.Scene
import javafx.scene.control.Label
import javafx.scene.layout.StackPane
import javafx.stage.Screen
import javafx.stage.Stage
class App : Application() {
override fun start(primaryStage: Stage?) {
val content = Label("Hello")
val root = StackPane(content)
val bounds: Rectangle2D = Screen.getPrimary().visualBounds
val scene = Scene(root, bounds.width, bounds.height)
primaryStage?.scene = scene
primaryStage?.show()
}
}
解决方案
你可以,但你可能会在此过程中遇到一些痛苦,我的建议是使用 TornadoFx,它是基于 JavaFx 构建的 Kotlin UI 框架。它真的很好
这是集成指南
推荐阅读
- c++ - Bison中的“语法错误”没有解释
- php - .htaccess 根文件夹之外的文档根目录
- r - 插入符号包警告消息:“重新采样的性能度量中缺少值”
- awk - awk 拆分并反转顺序
- c++ - 在 C++ 中更改函数返回值(在运行时)
- python - 如何将条件添加到数据库的代码中?
- database - 如何在 EMC ISILON NAS 中搜索?
- vue.js - 在开源项目的“vue”中找不到错误 PropType
- blockchain - ethers.js swapExactETHForTokens 和 swapExactTokensForTokens 上的煎饼交换
- python - 矩阵与列表 - 从 Matlab 切换到 Python