1

我无法掌握 Android UI 设计中的某个概念。我指的这本书首先使用了 Java 程序员用来创建 UI 的常用技术,即创建容器并向其中添加 UI 组件并根据需要嵌套它们。

现在,本书介绍了一个新概念,其中整个 UI 都是使用 XML 文件创建的。代码粘贴在下面:

package com.oreilly.android.intro;
import android.app.Activity;
import android.os.Bundle;
/**
* Android UI demo program
*/
public class AndroidDemo extends Activity {
  private LinearLayout root;
  @Override public void onCreate(Bundle state) {
   super.onCreate(state);
   setContentView(R.layout.main);
   root = (LinearLayout) findViewById(R.id.root);
 }
}  

所以基本上,我可以使用它们中的任何一个?

4

3 回答 3

4

简单的答案,是的,您可以使用任何一种方法。但是,每个都有一些限制,例如layout如果要使用它们,必须在 xml 中设置一些属性。我想不出什么是副手,但我可以查一下。

在大多数情况下,layouts在 xml 中创建要简单得多,但如果需要,您可以选择在 Java 中进行设置Views,例如根据某些用户定义的变量layouts创建未知数量的变量。Buttons

当您UI在 xml 中创建您的时,然后您inflate在您的 Java 代码中。这通常在onCreate()使用中完成

setContentView(R.layout.main);

正如您在示例中看到的那样。但它也可以用充气机来完成。

这里要记住的是layout,在尝试初始化views中的任何一个之前,使用任一方法膨胀你的 ,否则在膨胀它包含的之前尝试调用定义的方法时,layout你会得到一个。NPEViewlayout

正确的方法

**Examples of inflating views/layouts correctly**
    Button mBtn;
    public class AndroidDemo extends Activity {
  private LinearLayout root;
  @Override public void onCreate(Bundle state) {
   super.onCreate(state);
   setContentView(R.layout.main);
   root = (LinearLayout) findViewById(R.id.root);

   btn = (Button) findViewById(R.id.buttonId); // Button is initialized after inflating the layout
 }
} 

不正确的方式

    public class AndroidDemo extends Activity {
  private LinearLayout root;
  @Override public void onCreate(Bundle state) {
   super.onCreate(state);
   Button mBtn = (Button) findViewById(R.id.buttonId);  // Button is initialized before inflating layout which will return null
   setContentView(R.layout.main);
   root = (LinearLayout) findViewById(R.id.root);
}
}   

我添加了上面的示例,因为我看到很多人犯了这个错误。所以不要这样做......你已经被警告了!:)

于 2013-07-03T15:37:01.750 回答
2

不完全确定你在问什么,但两者是可以互换的。大多数情况下,您的 UI 将通过 xml 完成。但在某些情况下,用户界面严重依赖数据,因此您可能需要动态生成它。

它基本上归结为当时对您来说最容易的那个。

于 2013-07-03T15:37:09.453 回答
1

是的。但最好使用 xml,它更强大、更容易,并且会将布局与您的代码分开。看看文档:http: //developer.android.com/guide/topics/ui/declaring-layout.html

于 2013-07-03T15:37:16.190 回答