• 一手遮天 Android


    项目地址 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

  • 相关阅读:
    Pyhon基础过滤字符串中的字母数字特殊符号
    [编程题] 斐波那契数列
    左旋转字符串(Java)-循环Index方式
    [编程题]字符流中第一个不重复的字符
    6525. 【2020.4.1模拟】Valleys
    6515. 【GDOI2020模拟03.28】数一数(one)
    6516. 【GDOI2020模拟03.28】数二数(two)
    6508. 【GDOI2020模拟03.11】我的朋友们
    6494. 【GDOI2020模拟03.08】勘探
    6491. 【GDOI2020模拟03.04】铺路
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_view_layout_InflateDemo1.html
Copyright © 2020-2023  润新知