我如何获得对 LinearLayout 的引用?

How do I get a reference to a LinearLayout?

我正在尝试获取对 LinearLayout 的引用,以便我可以添加一个元素。

这是我的xml。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context=".MainActivity">

可以接受 android:id="@+id/myLayout" 行吗?

我试图获取对我的布局的引用的错误尝试如下:

LayoutInflater myLayoutInflater;
LinearLayout myLayout;

if((myLayoutInflater = m_Context.getLayoutInflater()) != null) {
    myLayout = (LinearLayout) myLayoutInflater.inflate(R.id.myLayout, null);
}

它在 inflate() 行的 R.id.myLayout 下划线,用红色表示:

Expected resource of type Layout. Ensure resource ids passed to APIs are of the right type.

尝试这样的事情,

LayoutInflater myLayoutInflater = LayoutInflater.fromContext(mContext);
LinearLayout myLayout = myLayoutInflater.inflate(R.layout.layout_file, null);
View view = (LinearLayout)view.findViewById(R.id.myLayout);

可以像查找视图一样按 ID 查找布局视图:

LinearLayout layout = (LinearLayout) findViewById(R.id.myLayout);

如果您处于 Activity 上下文中,这将起到作用。

要向其中添加视图,您可以执行以下操作:

layout.addView(...)

您收到该错误是因为 LayoutInflater 需要布局文件的 名称 而不是您的布局 ID,因此类似于 R.layout.item_layout。在大多数情况下,您也不想为父视图组传递 null,因此我不建议以这种方式膨胀它,除非您知道父布局。

对这些方法存在误解。

  • LayoutInflater.inflate

此方法需要 id 布局文件(而不是布局视图)。所以,你应该调用:

myLayoutInflater.inflate(R.layout.<NAME_OF_THE_XML_LAYOUT_FILE>, null);

该方法将 return 膨胀的整个视图。所以,现在您有了膨胀视图,您可以在其中搜索 Views。您可以通过他们的 ID 搜索视图。

  • findViewById()

此方法需要 Viewid。所以,在这里,你应该调用:

View inflatedView = myLayoutInflater.inflate(R.layout.<NAME_OF_THE_XML_LAYOUT_FILE>, null);
LinearLayout linearLayout = inflatedView.findViewById(R.id.myLayout); // Assuming you added android:id="@+id/myLayout" to the LinearLayout

请注意,首先,我们膨胀了 xml 文件,然后,我们开始在其中搜索视图。

然而

如果您的视图是 Activity 的一部分,则无需扩充该布局。您可以改为:

public void onCreate() {
    ....
    // This will inflate and add your layout to the actvity
    setContentView(R.layout.<NAME_OF_THE_LAYOUT_FILE);

    // After that line, you can call:
    LinearLayout linearLayout = inflatedView.findViewById(R.id.myLayout); // Assuming you added android:id="@+id/myLayout" to the LinearLayout

    // Since your view was added to the activity, you can search for R.id.myLayout
    // If you search for any view before setContentView(), it will return null
    // Because no view was added the screen yet
}