在Android 系统红,任何可视化组件都需要从android.view.View类继承。可以使用两种方式创建View对象。
· 一种方式是使用XML来配置View的相关属性,然后使用相应的方法来装载这些View。
· 另一种方式是完全使用java代码的方式来建立View。
1、 视图简介
Android中的视图可分为3种:布局类(Layout)、视图容器类(View Container)和视图类(例如,TextView就是一个直接继承与View类的视图类)。
android.view.ViewGroup是一个容器类,该类也是View的子类,所有的布局类和视图容器类都是ViewGroup的子类,而视图类直接继承自View类。
2、使用XML布局文件控制视图
XML布局文件是Android系统中定义视图的常用方法。所有XML布局文件必须保存在res/layout目录中。
XML布局文件的命名及定义需要注意如下6点:
· XML布局文件的扩展名必须是xml。
· 由于ADT会根据每一个XML布局文件名在R里中和生成一个变量,这个变量名就是XML布局文件名,因此XML布局文件名(不包含扩展名)必须符合java变量名的命名规则。
· 每一个XML布局文件的根节点可以是任意的组件(widget)。
· XML布局文件的根节点必须包含android命名空间,而且命名空间的值必须是http://schemas.android.com/apk/res/android。
· 为XML布局文件中的标签指定ID时需要使用这样的格式:@+id/somestringvalue,其中@+语法标识如果ID值在R.id类中不存在,则新产生一个与ID同名的变量,如果在R.id类中存在该变量,则直接使用这个变量。
· 由于每一个视图ID都会在R.id类中生成与之对应的变量,因此视图ID的值也要符合java变量的命名规则,这一点与XML布局文件名的命名规则相同。
下面是一个标准的XML布局文件的内容:
<!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="textview" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一个按钮" /> </LinearLayout>
如果要使用上面的XML布局文件(main.xml),通常需要在onCreate方法中使用setContentView方法指定XML布局文件的ziyuanID,代码如下:
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.mian); }
如果想要获得在mian.xml文件中定义的某个View,可以使用如下代码:
TextView textView = (TextView)findViewById(R.id.textview);
Button button = (Button)findViewById(R.id.button);
在获得XML布局文件中的视图对象时需要注意如下3点:
· 在使用findViewById方法之前必须先使用SetContentView方法装载XML布局文件,否则系统会抛出异常。
· 虽然所有的XML布局文件中的视图ID都在R.id类中生成了相应的变量,但使用findViewById方法只能获得已经装在的XML布局文件中的视图对象。
· 在不同的XML布局文件中可以有相同ID值的视图,但在同一个XML布局文件中,虽然也可以有相同ID值的视图,但通过ID值过得视图对象时,只能获得按定义顺序的第一个视图对象,其他相同ID值的视图对象将无法获得。因此,在同一个XML布局文件中应尽量是视图的ID值唯一。
3、在代码中控制视图
虽然使用XML布局文件可以非常方便的对组件进行布局,但若想控制这些组件的行为,仍然需要编写java代码。
下面的代码获得了一个TextView对象,并修改了TextView的文本。
TextView textView = (TextView)findViewById(R.id.textview);
textView.setText("一个新的文本");
setText方法不仅可以直接使用字符串来修改,也可以使用字符串资源对TextView的文本进行修改。
textView.setText(R.string.hello);
注:当setText方法的参数值是int类型时,会被人为这个参数值是一个字符串资源ID,因此,如果要将TextView的文本设为一个证书,需要将这个整数转换成String类型。
任何应用程序都离不开事件,在Android应用程序中一般使用以setOn开头的方法来设置事件类的对象实例。下面的代码为一个Button对象设置了单击事件。
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
在更高级的Android应用中,往往需要动态添加视图。要实现这个功能,最重要的是获得被添加的视图所在的容器对象,这个容器对象所对应的类需要继承ViewGroup。通常这些容器视图呗定义为XML布局文件的根节点。例如,<LinearLayout>、<RelativeLayout>等。
将其他的视图添加到电脑跟前的容器视图中需要如下几步:
· 获得当前的容器视图对象。
· 获得或创建待添加的视图对象。
· 将相应的视图对象添加到容器视图中。
例:
假设有两个XML布局文件:test1.xml 和 test2.xml 。这两个XML布局文件的根节点都是<LinearLayout>,下面的代码获得了 test2.xml 文件中的LinearLayout对象,并将该对象座位test1.xml文件中的<LinearLayout>标签的子节点添加到test1.xml的 LinearLayout对象中。
//获得test1.xml中的LinearLayout对象 LinearLayout testLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null); //将test1.xml中的LinearLayout对象设为当前容器视图 setContentView(testLinearLayout1); //获得test2.xml中的LinearLayout对象,并将该对象添加到test1.xml的LinearLayout对象中 LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, testLinearLayout1);
其中inflate方法的第一个参数标识XML布局资源文件的ID,第二个参数标识获得容器视图对象后,要将该对象添加到那个容器视图对象中。在这里testLinearLayout1对象。如果不想将获得的容器视图对象添加到融合其他的容器中,inflate放的第二个参数需要设为null。
除了上面添加方式外,也可以使用addView方法向容器视图中添加视图对象,但要将inflate方法的第二个参数值设为null。
//获得test1.xml中的LinearLayout对象 LinearLayout testLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null); //将test1.xml中的LinearLayout对象设为当前容器视图 setCOntentView(testLinearLayout1); //获得test2.xml 中的LinearLayout对象,并将该对象添加到test1.xml的LinearLayout对象中 LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, null); testLinearLayout1.addView(testLinearLayout2);
除此之外,还可以完全使用java代码创建一个视图对象,并将该对象添加到布局视图中,代码如下:
EditText editText = new EditText(this);
testLinearLayout1.addView(editText);
向布局视图添加视图对象时需要注意如下2点:
· 如果使用setCOntentView方法将容器视图设为当前视图后,还想向容器视图中添加新的视图或进行其他的操作,setContentView方法的参数值应直接使用容器视图对象,因为这样可以向容器视图对象中添加新的视图。
· 一个视图只能有一父视图,也就是说,一个视图只能被包含在一个容器视图中,因此,在向容器视图添加其他视图时,不能将XML布局文件中非根节点的视图对象添加到其他的容器视图中。例如,在前面的例子中不能将使用testLinearLayout.findViewById(R.id.textView2)获得的TextView对象添加到testLinearLayout1对象中,这是因为这个TextView对象已经属于test2.xml中的<LinearLayout>标签了,不能再属于test1.xml中的<LinearLayout>标签了。