android 中 setContentView() 的前世今生

新建一个android项目时,  初始化activity时,总能看到到setContentView(R.layout.main);这行代码,以前只知道这行代码能把main布局文件的内容布局加载并显示出来,但是加载的过程并不是十分清楚,今天经过查询资料,对他的实现过程总结一下,自己学习的同时也希望能帮助有相同疑惑的同仁们。

android的编写与java有着莫大的渊源,我们从java一路走来,习惯于任何对象都是new出来,android与java一脉相承,那么在这里面我们需要的对象可以自己new吗?

回答是肯定的,下面的控件都是通过硬编码new出所需的控件,

 LayoutParams params=new LayoutParams(0,LayoutParams.WRAP_CONTENT, 1.0f);//注意是那个布局的布局参数,如线性布局
       
       TextView tvUserName=new TextView(this);
       tvUserName.setText("用户名");
       EditText etUserName=new EditText(this);
       etUserName.setHint("请输入用户名");
       etUserName.setLayoutParams(params);//设置布局参数
       LinearLayout row1=new LinearLayout(this);
       row1.addView(tvUserName);
       row1.addView(etUserName);
       
       TextView tvPassword=new TextView(this);
       tvPassword.setText("密	码");
       EditText etPassword=new EditText(this);
       etPassword.setHint("请输入密码");
       LinearLayout row2=new LinearLayout(this);
       row2.addView(tvPassword);
       row2.addView(etPassword,params);
       
       
       Button btnLogin=new Button(this);
       btnLogin.setText("登陆");
       Button btnCancle=new Button(this);
       btnCancle.setText("取消");
       LinearLayout row3=new LinearLayout(this);
       row3.addView(btnLogin,params);
       row3.addView(btnCancle,params);
       
       LinearLayout root=new LinearLayout(this);
       root.setOrientation(LinearLayout.VERTICAL);
       root.addView(row1);
       root.addView(row2);
       root.addView(row3);
       this.setContentView(root);
我们并把多有的组件组成视图,然后单击运行,出现下面的界面:
这说明采用硬编码的方式完全可以实现将布局文件文件显示出来,但是采用这种方式显示,需要书写大量的代码,增加程序员的负担,因此,android把布局放到xml文件中,
作为资源的一部分,通过LayoutInflater这个类将xml布局文件加载并显示成对应视图。解析xml文件需要用到的方法有LayoutInflater的静态方法from来获取一个LayoutInflater实例inflater,再通过inflater的inflate方法返回一个视图实例,最后通过setContentView的方法把这个视图实例加载出来。实现的代码如下:
对应的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户名" />

        <EditText
            android:id="@+id/etUserName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tvPassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密    码" />

        <EditText
            android:id="@+id/etUserPass"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btnLogin"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:text="登    录" />

        <Button
            android:id="@+id/btnCancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:text="取    消" />
    </LinearLayout>

</LinearLayout>

activity中用到的相关代码:


	LayoutInflater inflater=LayoutInflater.from(this);
      	LinearLayout root= (LinearLayout) inflater.inflate(R.layout.main, null);
       this.setContentView(root);
LayoutInflater这个类一般用在非activity中设置相应的视图;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章