我对编程还很陌生,从 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 应用开发过程中编写了大量 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/