Android LayoutInflater 细节

本文深入探讨了Android中inflate方法在不同场景下的使用方式及其特点,包括Activity、BaseAdapter的getView方法以及Fragment的onCreateView方法中inflate方法的不同调用方式,并分析了各种情况下可能遇到的问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分别来看三种情况的inflate()方法

  • Activity中
  • BaseAdapter getView()方法中
  • Fragment onCreateView()方法中

Activity中

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout container = (LinearLayout) findViewById(R.id.container);
        View view = getLayoutInflater().inflate(R.layout.content, null);
        container.addView(view);
    }
}

activity_main.xml

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

</LinearLayout>

content.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="300dp"
    android:background="@color/colorAccent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/app_name" />
</LinearLayout>

给inflate()传不同的参数

  • View view = getLayoutInflater().inflate(R.layout.content, null);
    这里写图片描述
  • View view = getLayoutInflater().inflate(R.layout.content, container, false);
    这里写图片描述
  • View view = getLayoutInflater().inflate(R.layout.content, container, true);
    抛异常:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.

现在去掉container.addView(view);

  • View view = getLayoutInflater().inflate(R.layout.content, container, false);
    这里写图片描述
  • View view = getLayoutInflater().inflate(R.layout.content, container, true);
    这里写图片描述

可以看到:
inflate(R.layout.content, null);会导致content.xml中根元素设置的android:layout_height=”300dp” 不起作用

inflate(R.layout.content, container, false);android:layout_height=”300dp” 会生效
此时如果不进行container.addView(view); 将会什么都不显示, 也就是没有添加到父布局container中.

而inflate(R.layout.content, container, true);的时候, 就不能进行container.addView(view), 因为attachToRoot为true的时候, 已经添加到添加到父布局container中了.

BaseAdapter getView()方法中

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.listView);
        mListView.setAdapter(new MAdapter());
    }

    class MAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return 20;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getLayoutInflater().inflate(R.layout.content, null);
        }
    }
}

activity_main.xml

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

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/colorAccent"
        android:dividerHeight="2dp" />
</LinearLayout>

content.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="300dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/app_name" />
</LinearLayout>

给inflate()传不同的参数

  • return getLayoutInflater().inflate(R.layout.content, null);
    这里写图片描述
  • return getLayoutInflater().inflate(R.layout.content, parent, false);
    这里写图片描述
  • return getLayoutInflater().inflate(R.layout.content, parent, true);
    抛异常:

Caused by: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

同上面一样

inflate(R.layout.content, null);会导致content.xml中根元素设置的android:layout_height=”300dp” 不起作用

inflate(R.layout.content, container, false);android:layout_height=”300dp” 会生效, Item高度为300dp

Fragment onCreateView()方法中

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction().add(R.id.container, new MFragment())
                .commit();
    }
}

activity_main.xml

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

</LinearLayout>

MFragment

public class MFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.content, null);
    }
}
  • return inflater.inflate(R.layout.content, null);
    这里写图片描述
  • return inflater.inflate(R.layout.content, container, false);
    这里写图片描述
  • return inflater.inflate(R.layout.content, container, true);

抛异常:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.

  • inflater.inflate(R.layout.content, container, true);
  • return null;
    这里写图片描述

显示和第二种一样, 但是没什么意义.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值