当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

10.8 LayoutInflater(布局服务)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:28:04

本节引言: 本节继续带来的是Android系统服务中的LayoutInflater(布局服务),说到布局,大家第一时间可能想起的是写完一个布局的xml,然后调用Activity的setContentView()加载布局,然后把他显示到屏幕上是吧~其实这个底层走的还是这个LayoutInflater,用的Android内置的Pull解析器来解析布局。一般在Android动态加载布局或者添加控件用得较多,本节我们就来学习下他在实际开发中的一些用法~官方API文档:LayoutInflater1.LayoutInflater的相关介绍1)Layout是什么鬼?答:一个用于加载布局的系统服务,就是实例化与Layout XML文件对应的View对象,不能直接使用,需要通过getLayoutInflater( )方法或getSystemService( )方法来获得与当前Context绑定的LayoutInflater实例!2)LayoutInflater的用法①获取LayoutInflater实例的三种方法:LayoutInflater inflater1 = LayoutInflater.from(this); LayoutInflater inflater2 = getLayoutInflater(); LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); PS:后面两个其实底层走的都是第一种方法~②加载布局的方法:public View inflate (int resource, ViewGroup root, boolean attachToRoot)该方法的三个参数依次为:①要加载的布局对应的资源id②为该布局的外部再嵌套一层父布局,如果不需要的话,写null就可以了!③是否为加载的布局文件的最外层套一层root布局,不设置该参数的话,如果root不为null的话,则默认为true如果root为null的话,attachToRoot就没有作用了!root不为null,attachToRoot为true的话,会在加载的布局文件最外层嵌套一层root布局;为false的话,则root失去作用!简单理解就是:是否为加载的布局添加一个root的外层容器~!③通过LayoutInflater.LayoutParams来设置相关的属性:比如RelativeLayout还可以通过addRule方法添加规则,就是设置位置:是参考父容器呢?还是参考子控件?又或者设置margin等等,这个由你决定~2.纯Java代码加载布局我们早已习惯了使用XML生成我们需要的布局,但是在一些特定的情况下,我们需要使用Java代码往我们的布局中动态的添加组件或者布局!但是不建议大家完全地使用Java代码来编写Android页面布局,首先一点就是代码会多,一多久容易乱,而且不利于业务的分离,我们还是建议使用xml来完成布局,然后通过Java代码对里面的组件进行修改,当然有些时候可能需要使用Java动态的来添加组件!纯Java代码加载布局的流程:——Step 1:①创建容器:LinearLayout ly = new LinearLayout(this);②创建组件:Button btnOne = new Button(this);——Step 2:可以为容器或者组件设置相关属性:比如:LinearLayout,我们可以设置组件的排列方向:ly.setOrientation(LinearLayout.VERTICAL);而组件也可以:比如Button:btnOne.setText("按钮1");关于设置属性的方法可参见Android 的API,通常xml设置的属性只需在前面添加:set即可,比如setPadding(左,上,右,下);——Step 3:将组件或容器添加到容器中,这个时候我们可能需要设置下组件的添加位置,或者设置他的大小:我们需要用到一个类:LayoutParams,我们可以把它看成布局容器的一个信息包!封装位置与大小等信息的一个类!先演示下设置大小的方法:(前面的LinearLayout可以根据不同容器进行更改)LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 很简单,接着就到这个设置位置了,设置位置的话,通常我们考虑的只是RelativeLayout!这个时候用到LayoutParams的addRule( )方法!可以添加多个addRule( )哦!设置组件在父容器中的位置,比如设置组件的对其方式:RelativeLayout rly = new RelativeLayout(this); RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); Button btnOne = new Button(this); rly.addView(btnOne, lp2);参照其他组件的对其方式:(有个缺点,就是要为参考组件手动设置一个id,是手动!!!!)比如:设置btnOne居中后,让BtnTwo位于btnOne的下方以及父容器的右边!public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RelativeLayout rly = new RelativeLayout(this); Button btnOne = new Button(this); btnOne.setText("按钮1"); Button btnTwo = new Button(this); btnTwo.setText("按钮2"); // 为按钮1设置一个id值 btnOne.setId(123); // 设置按钮1的位置,在父容器中居中 RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rlp1.addRule(RelativeLayout.CENTER_IN_PARENT); // 设置按钮2的位置,在按钮1的下方,并且对齐父容器右面 RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rlp2.addRule(RelativeLayout.BELOW, 123); rlp2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); // 将组件添加到外部容器中 rly.addView(btnTwo, rlp2); rly.addView(btnOne, rlp1); // 设置当前视图加载的View即rly setContentView(rly); } } ——step 4:调用setContentView( )方法加载布局对象即可!另外,如果你想移除某个容器中的View,可以调用容器.removeView(要移除的组件);运行截图:3.Java代码动态添加控件或xml布局第二点我们讲解了使用纯Java代码来加载布局,实际当中用得并不多,更多的时候是动态的添加View控件以及动态的加载XML布局!1)Java代码动态增加View动态添加组件的写法有两种,区别在于是否需要先setContentView(R.layout.activity_main);下

[1] [2] [3]  下一页


10.8 LayoutInflater(布局服务)