如何获得对LinearLayout的引用?

时间:2019-07-12 11:56:47

标签: android android-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);
}

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

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

3 个答案:

答案 0 :(得分:2)

对这些方法有误解。

  • LayoutInflater.inflate

此方法期望布局文件(而不是布局视图)的id。因此,您应该致电:

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

该方法将返回已放大的整个视图。因此,既然您拥有膨胀的视图,则可以在其内部搜索Views。您可以通过其ID搜索视图。

  • findViewById()

此方法需要id中的View。因此,在这里,您应该致电:

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文件,然后开始在其中寻找视图。

如何

如果视图是“活动”的一部分,则无需膨胀该布局。您可以改为:

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
}

答案 1 :(得分:1)

尝试这样的事情,

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

答案 2 :(得分:1)

可以按ID为布局查找视图,就像对视图一样:

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

如果您处于“活动”上下文中,这将解决问题。

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

layout.addView(...)

您收到该错误消息是因为LayoutInflater期望布局文件名,而不是您的布局ID,所以类似R.layout.item_layout。在大多数情况下,您也不想为父视图组传递null,因此,除非您知道父布局,否则我不建议以此方式对其进行夸大。