版权声明:原创文章,未经博主允许不得转载,欢迎加入AR/VR开发群:548077040。 https://blog.csdn.net/yywan1314520/article/details/52740362
1.为了满足多样化的定制需求,传统的UI加载方式已经满足不了我们的需求,为了创建出更友好,更快速的界面,我们有时需要根据用户的需求来生成控件,android动态加载机制简析,下面介绍常见的三种方式。
2.最常见的传统加载机制
这种方式也就我们用的比较多的一样方式,一般最简单的就是用这种方式来生成控件的,这种方式先将所需要的控件写在.xml文件中,然后通过setContentView(R.layout.main);就搞定了,这种方式太简单就不再讲解了。
3.通过创建容器来加载UI控件,这种方式就是动态加载中的一种。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
// 创建一个容器
final LinearLayout layout2=new LinearLayout(this);
// 设置容器的布局方式
layout2.setOrientation(LinearLayout.VERTICAL);
// 新建按钮1
Button btn1=new Button(this);
// 新建按钮2
Button btn2=new Button(this);
// 按钮显示的文字
btn1.setText("Button1");
btn2.setText("Button2");
// 将按钮控件加入到容器中
layout2.addView(btn1);
layout2.addView(btn2);
//显示
setContentView(layout2);
}
上面那种方式可以创建多种容器,也可以布局多种UI控件,还可以设置View和ViewGroup的其它参数,如宽高等。
4.通过 LayoutInflater 来间接加载
这种加载方式有三种形式,如下
- 方法一: LayoutInflater layoutInflater = LayoutInflater.from(context);
- 方法二:LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - 方法三: this.getLayoutInflater();
三种方式并没有太大的区别,本质都是调用Context.getSystemService()。只是不同的分装形式而已,layoutInflater.inflate(resourceId, root); inflate()方法一般接收两个参数,第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。
那么这种方式和我们平时用的findViewById()方法又有什么不同呢?
LayoutInflater通常用于动态载入的界面,使用LayoutInflater的inflate方法动态接入layout文件;
findViewById通常用于在已经载入的界面,使用findViewById()方法来获得其中的界面元素。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater mInflater = LayoutInflater.from(this);
View contentView = mInflater.inflate(R.layout.main,null);
TextView text = (TextView)contentView.findViewById(R.id.DynamicText);
text.setText("Hello Dragon test");
setContentView(contentView);
}