欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LayoutInflater使用

程序员文章站 2024-02-10 23:49:04
...

LayoutInflater

主要用于加载布局,把xml转为View

获取实例的方法

  • LayoutInflater inflater = LayoutInflater.from(this);
  • LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

使用

layoutInflater.inflate(resourceId, root);

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

  • resource xml布局
  • root 接收View的容器
  • attachToRoot是否添加到容器中

举例:

// 1. 返回的是button_layout的布局view, 不设置root, 此时view的根布局属性失效
// button的layout_width和layout_height都为wrap_content
View view = getLayoutInflater().inflate(R.layout.button_layout, null);
mainlayout.addView(view);

// 2. 返回的是mainlayout, 此时view的根布局属性有效
// button的layout_width和layout_height都为match_parent
View view = getLayoutInflater().inflate(R.layout.button_layout, mainlayout);

// 3. 返回的是button_layout的布局view, 此时view的根布局属性有效
// button的layout_width和layout_height都为match_parent
View view = getLayoutInflater().inflate(R.layout.button_layout, mainlayout, false);
mainlayout.addView(view);

button_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="button">
</Button>

root

    <LinearLayout
        android:id="@+id/mainlayout"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="horizontal" />

设置View在布局中的大小的,也就是说,首先View必须存在于一个布局中,之后如果将layout_width设置成match_parent表示让View的宽度填充满布局,如果设置成wrap_content表示让View的宽度刚好可以包含其内容,如果设置成具体的数值则View的宽度会变成相应的数值。这也是为什么这两个属性叫作layout_width和layout_height,而不是width和height。

常用的地方:

  1. Fragment使用:
    xml里面的布局是有效的
    mView = inflater.inflate(getLayoutId(), container, false);
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 后面container会再调用addview, 因此这里attachtoroot=false
        // 见FragmentManger的1309行
        View view = inflater.inflate(R.layout.fragment_t, container, false);
        return view;
    }
  1. ListView的Adapter, 外层的layout_width和layout_heigth都是wrap_content
    View view=inflater.inflate(R.layout.layout_student_item,null);