一手遮天 Android - view(布局类): 通过 inflate 动态加载布局文件

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 Android - view(布局类): 通过 inflate 动态加载布局文件

示例如下:

/view/layout/InflateDemo1.java

/**
 * 演示如何通过 inflate 动态加载布局文件
 *
 * 有 3 种方式
 * 1、View view = View.inflate(context, int resource, ViewGroup root);
 *    相当于 LayoutInflater.from(context).inflate(int resource, ViewGroup root, true);
 * 2、View view = LayoutInflater.from(context).inflate(int resource, ViewGroup root);
 *    相当于 LayoutInflater.from(context).inflate(int resource, ViewGroup root, true);
 * 3、View view = LayoutInflater.from(context).inflate(int resource, ViewGroup root, boolean attachToRoot);
 *
 * 也就是说只要明白下面这个方法就行了
 * View view = LayoutInflater.from(context).inflate(int resource, ViewGroup root, boolean attachToRoot);
 *     resource - 需要加载的布局文件的资源 id
 *     root - 父容器(指定父容器后,才能计算出动态加载的布局文件的根布局中的 width, height 之类的属性)
 *     attachToRoot - 是否将获取到的 view 添加到父容器中(如果指定的父容器是 null,则此值无论你传的是什么,都视为 false)
 *     返回值就是获取到的 view
 */

package com.webabcd.androiddemo.view.layout;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import com.webabcd.androiddemo.R;

public class InflateDemo1 extends AppCompatActivity {

    private LinearLayout _container;
    private Button _button1;
    private Button _button2;
    private Button _button3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_layout_inflatedemo1);

        _container = findViewById(R.id.container);
        _button1 = findViewById(R.id.button1);
        _button2 = findViewById(R.id.button2);
        _button3 = findViewById(R.id.button3);

        // 获取当前 activity 的根布局的父容器
        ViewGroup parent =  getWindow().getDecorView().findViewById(android.R.id.content);
        // 获取当前 activity 的根布局(以本例为例,其获取到的结果和 _container 是一样的)
        LinearLayout root = (LinearLayout)parent.getChildAt(0);

        sample();
    }

    private void sample() {
        _button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 动态加载指定的布局文件,并指定其父容器,并自动添加到此父容器中(下面 3 句代码是一样的)

                // View layoutView = View.inflate(ViewDemo4.this,  R.layout.view_view_layout_inflatedemo1, _root);
                // View layoutView = LayoutInflater.from(ViewDemo4.this).inflate(R.layout.view_view_layout_inflatedemo1, _root);
                View layoutView = LayoutInflater.from(InflateDemo1.this).inflate(R.layout.view_view_layout_inflatedemo1, _container, true);
            }
        });

        _button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 动态加载指定的布局文件,并指定其父容器,但是不自动添加到此父容器中
                View layoutView = LayoutInflater.from(InflateDemo1.this).inflate(R.layout.view_view_layout_inflatedemo1, _container, false);
                // 手动将获取到的 view 添加到指定的父容器中
                _container.addView(layoutView);
            }
        });

        _button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 动态加载指定的布局文件,但是不指定其父容器
                View layoutView = LayoutInflater.from(InflateDemo1.this).inflate(R.layout.view_view_layout_inflatedemo1, null);
                // 手动将获取到的 view 添加到指定的父容器中
                // 请运行本例看实际效果,由于 inflate 的时候未指定父容器,所以加载的 view 的高度计算是有问题的
                _container.addView(layoutView);
            }
        });
    }
}

/layout/activity_view_layout_inflatedemo1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/container">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="inflate 说明 1"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="inflate 说明 2"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="inflate 说明 3"/>


</LinearLayout>

/layout/view_view_layout_inflatedemo1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@color/blue">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="layout"
        android:textColor="@color/white"/>

</LinearLayout>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

上一篇:LayoutInflater.inflate()总结


下一篇:SAP中的事务锁