Java:Android UI (Android Studio) 和 java 后端(模型)的交互/连接(与 JavaFX 相比)

标签 java android javafx

我对编程还很陌生,从 Java 开始,转到 JavaFX 作为 GUI 开发,刚刚使用 Android Studio 解决了 Android 应用程序开发问题。

来自 JavaFX 及其将 UI 连接到后端 Controller 的概念,我对 Android UI 与 Java 后端( Controller 、模型)的(显然)复杂得多的交互感到有点困惑。

我的场景:我使用 JavaFX 编写了一个游戏应用程序,它运行得很好。我应用了 MVC 概念,而我使用 FXML 来构建 UI,有一个 Controller.java 类,它通过 @FXML 将所有 UI 元素“连接”到我的 Controller 类,然后我可以 - Controller 内的交叉方法 ​​- 访问我的 UI 元素(例如,用于从 slider 读取值或更改它们),例如:

@FXML
private text label;

public void readLabel(){

String labelText = label.getText();
}

现在:在 Android 中(使用 Android Studio),我尝试应用相同的概念/想法,但失败了,因为显然各种 View 、按钮、文本分别有自己的类,需要相互转换,以便它们的内容可以使用。

因此,我遵循 Android 概念,并尝试最初在 MainActivity 类中声明所有 UI 元素,如下所示:

public class MainActivity extends AppCompatActivity {

    EditText inputText = (EditText) findViewById(R.id.text1);
    EditText outputText = (EditText) findViewById(R.id.textOutput);
    Button enterButton = (Button) findViewByID(R.id.button1);

...

这是因为我想在 MainActivity 中的不同方法中重用(简单地访问/更改)它们。 由于 NullPointerException,上述方法失败。我尝试用以下方法初始化相应的对象:

Button button1 = new Button();

但这也不起作用。

但是,如果我在 MainActivity 的方法中使用上述方法,它就可以正常工作:

public class MainActivity extends AppCompatActivity {

public void enterMessage(View view){

        EditText inputText = (EditText) findViewById(R.id.text1);
        String textOutput = inputText.getText().toString();

        EditText outputText = (EditText) findViewById(R.id.textOutput);
        outputText.setText(textOutput);

    }

我可以读取和更改我的 UI 对象。

然后我有了在 MainActivity 中创建一个静态“ Controller 方法”的想法,以便我可以从 MainActivity 中的任何其他方法访问我的 UI 元素。但这并没有成功,因为

findViewById()

不适合静态方法。

因此,在尝试这些不同的方法之后,我现在看到的唯一方法是创建新对象并将它们转换为所需的变量,例如:

EditText inputText = (EditText) findViewById(R.id.text1);
String textOutput = inputText.getText().toString();

在我想在 MainActivity 中创建的每个方法中。

现在我的问题是:与 JavaFX 相比,Android UI 类的概念确实更复杂,还是我只是在基础知识的某个地方弄错了?任何关于最佳实践的提示都非常感谢。 :)

谢谢!

最佳答案

更复杂的是 the lifecycle Android 应用程序内的 View 。例如,在 Java 的 Swing 中,不存在 View / Controller 的生命周期之类的东西,而且我也不了解 JavaFX。尽管编程语言不同,但底层平台并不相同。

Android 诞生于设备几乎没有任何可用内存和计算能力的背景下。为此,Android 尝试尽可能多地节省资源。

您必须监听“Activity ”生命周期事件,因为它们可能会影响您的“ View ”对象是否仍然存在。例如:您可能正在运行 MainActivity 实例,但只需将手机转为横向模式即可使当前的 MainActivity 终止并获取具有更新后的 View 的新实例。

Android activity lifecycle

因此,您会发现自己在 Android 应用开发过程中编写了大量 findViewById。但有一些解决方案可以让 Android 开发变得更容易一些。

根据您使用 @FXML 的经验,我建议您查看 ButterKnife这是一个注释处理器,可以为您处理 findViewById ,它可能会对您有很大帮助。看起来消费 View 的方式是类似的

另请查看Android's Architecture components因为它们利用了大量的样板代码,让您可以专注于您想要编写的内容。特别DataBinding

我还强烈建议您了解一下 Kotlin,因为它在 JVM 上运行,并且您可以将它用于 Android 和 Java 开发。事实证明,它是一种使用起来非常有趣的语言,而且就完成某件事所需编写的代码量而言,它非常高效。

关于Java:Android UI (Android Studio) 和 java 后端(模型)的交互/连接(与 JavaFX 相比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59912052/

相关文章:

java - SimpleStringProperty 和 StringProperty 的区别

java - 带有 ReSTLet 的 GWT

java - 尝试预填充房间数据库

android - 为android编译C库

android - 嵌套的 RecyclerView 预取不适用于初始滚动

JavaFX:暂停直到动画完成

java - 在 fxml 中将国际化字符串与非国际化字符串组合

java - 突变测试 - 以 for-each 循环为条件否定?

java - Neo4j:删除2个节点之间的关系 Neo.ClientError.Statement.SyntaxError

java - Linux 上运行的 Java 应用程序列表