LayoutInflater使用

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);

推荐阅读更多精彩内容