Android 学习手札(三) 视图(View)

  在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>标签了。

原文地址:https://www.cnblogs.com/lightxun/p/3552350.html