• 动态设置布局LayoutInflater


    LayoutInflater作用是将layout的xml布局文件实例化为View类对象。LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout目录下的xml布局文件。而且实例化!而 findViewById()是找详细某一个xml下的详细 widget控件(如:Button,TextView等)。

    获得 LayoutInflater 实例的三种方式、

    1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()
    2.LayoutInflater inflater = LayoutInflater.from(this);

    3.LayoutInflater inflater = (LayoutInflater)Context.getSystemService(LAYOUT_INFLATER_SERVICE);

    getLayoutInflater():
    Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法。看一下该源码:
    public PhoneWindow(Context context) { super(context); mLayoutInflater = LayoutInflater.from(context); }
    能够看出它事实上是调用 LayoutInflater.from(context)。
    LayoutInflater.from(context):
    public static LayoutInflater from(Context context) {  
        LayoutInflater LayoutInflater =  
                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
        if (LayoutInflater == null) {  
            throw new AssertionError("LayoutInflater not found.");  
        }  
        return LayoutInflater;  
    }
    能够看出它事实上调用 context.getSystemService()。


    结论:所以这三种方式终于本质是都是调用的Context.getSystemService()。

    实例化LayoutInflater之后,就要将layout的xml布局文件实例化为View类对象。


    1.LayoutInflater inflater = getLayoutInflater(); View view=inflater.inflate(R.layout.ID, null);
    2.LayoutInflater inflater = LayoutInflater.from(this); View view=inflater.inflate(R.layout.ID, null);
    3.LayoutInflater inflater = (LayoutInflater)Context.getSystemService(LAYOUT_INFLATER_SERVICE); View view=inflater.inflate(R.layout.ID, null);

    inflate 方法
    通过 sdk 的 api 文档。能够知道该方法有下面几种过载形式,返回值均是 View 对象,例如以下:
    public View inflate (int resource, ViewGroup root) (经常使用) inflate()方法一般接收两个參数,第一个參数就是要载入的布局id,第二个參数是指给该布局的外部再嵌套一层父布局,假设不须要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它加入到指定的位置就能够显示出来了。
    public View inflate (XmlPullParser parser, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot) public View inflate (int resource, ViewGroup root, boolean attachToRoot)
    LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));   
    //EditText editText = (EditText)findViewById(R.id.content);
    // error EditText editText = (EditText)view.findViewById(R.id.content);

    对于上面代码。指定了第二个參数 ViewGroup root。当然你也能够设置为 null 值。

    Demo:

    以下我们就通过一个很easy的小样例,来更加直观地看一下LayoutInflater的使用方法。

    比方说当前有一个项目。当中MainActivity相应的布局文件叫做activity_main.xml,代码例如以下所看到的:

    1.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2.android:id="@+id/main_layout"
    3.android:layout_width="match_parent"
    4.android:layout_height="match_parent" >
    5. 
    6.</LinearLayout>
    这个布局文件的内容很easy。仅仅有一个空的LinearLayout,里面什么控件都没有,因此界面上应该不会显示不论什么东西。

    那么接下来我们再定义一个布局文件,给它取名为button_layout.xml,代码例如以下所看到的:

    2.android:layout_width="wrap_content"
    3.android:layout_height="wrap_content"
    4.android:text="Button" >
    5. 
    6.</Button>

    这个布局文件也很easy。仅仅有一个Buttonbutton而已。

    如今我们要想办法,怎样通过LayoutInflater来将button_layout这个布局加入到主布局文件的LinearLayout中。

    依据刚刚介绍的使用方法,改动MainActivity中的代码。例如以下所看到的:

    01.public class MainActivity extends Activity {
    02. 
    03.private LinearLayout mainLayout;
    04. 
    05.@Override
    06.protected void onCreate(Bundle savedInstanceState) {
    07.super.onCreate(savedInstanceState);
    08.setContentView(R.layout.activity_main);
    09.mainLayout = (LinearLayout) findViewById(R.id.main_layout);
    10.LayoutInflater layoutInflater = LayoutInflater.from(this);
    11.View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);
    12.mainLayout.addView(buttonLayout);
    13.}
    14. 
    15.}

    能够看到。这里先是获取到了LayoutInflater的实例。然后调用它的inflate()方法来载入button_layout这个布局,最后调用LinearLayout的addView()方法将它加入到LinearLayout中。

    如今能够执行一下程序,结果例如以下图所看到的:

    Button 在界面上显示出来了!

    说明我们确实是借助LayoutInflater成功将button_layout这个布局加入到LinearLayout中了。 LayoutInflater技术广泛应用于须要动态加入View的时候,比方在ScrollView和ListView中。常常都能够看到 LayoutInflater的身影。


  • 相关阅读:
    oracle 认证方式
    Oracle
    深入理解Java的接口和抽象类
    mongoDB的学习【小白的福音】
    对于vertical-align的学习
    flex的学习 flexBox的学习
    用伪类添加翘边阴影::before和::after
    icon小图标
    url 中的 ? 和 & 还有 # 的作用
    解决img的1px空白问题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5307977.html
Copyright © 2020-2023  润新知