Android 动态加载布局文件

本文转自:Android开发技巧:动态创建UI界面

Android的基本UI界面一般都是在xml文件中定义好,然后通过activity的setContentView来显示在界面上,这是Android UI的最简单的构建方式。为了实现更加复杂和更加灵活的UI界面,往往需要动态生成UI界面,甚至根据用户的点击或者配置,动态改变UI本文即介绍该技巧。

假设Android工程的一个xml文件名为activity_main.xml,定义如下:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView 
        android:id="@+id/DynamicText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout> 

在MainActivity中,希望显示这个简单的界面有三种方式(注:以下 的代码均在MainActivity的onCreate()函数中实现)。

1、直接通过传统的setContentView(R.layout.*)来加载

setContentView(R.layout.activity_main);

TextView text = (TextView)this.findViewById(R.id.DynamicText);
text.setText("Hello world");

2、通过LayoutInflater来间接加载

LayoutInflater mInflater = LayoutInflater.from(this);
View contentView = mInflater.inflate(R.layout.activity_main,null);

TextView text = (TextView)contentView.findViewById(R.id.DynamicText);
text.setText("Hello world");

setContentView(contentView);

注意:LayoutInflater相当于一个“布局加载器”,有三种方式可以从系统中获取到该布局加载器对象,如下

  • LayoutInflater.from(this);
  • (LayoutInflater)this.getSystemService(this.Layout_INFLATER_SERVICE);
  • this.getLayoutInflater();

通过该对象的inflate方法可以将指定的xml文件加载转换为View类对象,该xml文件中的控件的对象,都可以通过该View对象的findViewById方法获取。

3、纯粹手工创建UI界面

xml文件中的任何标签,都是有相应的类来定义的。因此,我们完全可以不使用xml文件,纯粹地动态创建所需的UI界面,如下:

LinearLayout layout= new LinearLayout(this);

TextView text = new TextView(this);
text.setText("Hello world");
text.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

layout.addView(text);
setContentView(layout);