小编典典

为什么 LayoutInflater 会忽略我指定的 layout_width 和 layout_height 布局参数?

all

为什么 LayoutInflater 会忽略我指定的布局参数?例如,为什么我的资源 XML
中的layout_widthlayout_height值不被尊重?


阅读 69

收藏
2022-08-24

共1个答案

小编典典

我已经调查了这个问题,参考了LayoutInflater
文档
并设置了一个小型示例演示项目。以下教程展示了如何使用LayoutInflater.

在我们开始之前,看看LayoutInflater.inflate()参数是什么样的:

  • resource : 要加载的 XML 布局资源的 ID(例如R.layout.main_page
  • root :作为生成层次结构的父级的可选视图(如果attachToRoottrue),或者只是一个LayoutParams为返回的层次结构的根提供一组值的对象(如果attachToRootfalse。)
  • attachToRoot :膨胀的层次结构是否应该附加到根参数?如果为 false,则 root 仅用于为LayoutParamsXML 中的根视图创建正确的子类。

  • 返回 :膨胀层次结构的根视图。如果提供了 root 并且attachToRoottrue,这是 root ;否则它是膨胀的 XML 文件的根。

现在是示例布局和代码。

主要布局(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">
</LinearLayout>

添加到此容器中的是一个单独的 TextView,如果从 XML ( red.xml) 成功应用布局参数,则显示为红色小方块:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:background="#ff0000"
    android:text="red" />

现在LayoutInflater与调用参数的几种变体一起使用

public class InflaterTest extends Activity {

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      ViewGroup parent = (ViewGroup) findViewById(R.id.container);

      // result: layout_height=wrap_content layout_width=match_parent
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view);

      // result: layout_height=100 layout_width=100
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view, 100, 100);

      // result: layout_height=25dp layout_width=25dp
      // view=textView due to attachRoot=false
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
      parent.addView(view);

      // result: layout_height=25dp layout_width=25dp 
      // parent.addView not necessary as this is already done by attachRoot=true
      // view=root due to parent supplied as hierarchy root and attachRoot=true
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
    }
}

参数变化的实际结果记录在代码中。

概要: 在不指定 root 的情况下调用LayoutInflater会导致忽略 XML 中的布局参数的调用膨胀。null在 root
不相等的情况下调用
inflateattachRoot=true会加载布局参数,但会再次返回根对象,这会阻止对加载的对象进行进一步的布局更改(除非您可以使用
找到它findViewById())。因此,您最有可能使用的调用约定是这个:

loadedView = LayoutInflater.from(context)
                .inflate(R.layout.layout_to_load, parent, false);

为了帮助解决布局问题,强烈建议使用布局检查器。

2022-08-24