findViewById() 在与合并标签一起使用时在包含标签上抛出空指针

Posted

技术标签:

【中文标题】findViewById() 在与合并标签一起使用时在包含标签上抛出空指针【英文标题】:findViewById() throws null pointer on include tag while using with merge tag 【发布时间】:2017-06-19 07:24:34 【问题描述】:

我正在尝试使用包含标记将一个布局 (xyz.xml) 合并​​到另一个布局 (main.xml) 中。我想在单击 main.xml 中的按钮时隐藏/显示布局 xyz.xml。因此,为此我将 id 提供给包含的视图。但是当我在java文件中访问它时,它会抛出空指针异常。 以下是我的 xyz.xml 文件代码:-

 <merge xmlns:android="http://schemas.android.com/apk/res/android" >
 <TextView
    android:id="@+id/tv_candidateName"
    android:layout_
    android:layout_
    android:drawableLeft="@drawable/icon_candidate_name"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/icon_candidate_name"
    android:padding="8dp"
    android:text="Raju jain"
    android:textColor="@android:color/black"
    android:textSize="15sp" />

<TextView
    android:id="@+id/tv_candidateEmail"
    android:layout_
    android:layout_
    android:layout_marginTop="5dp"
    android:drawableLeft="@drawable/icon_mail"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/icon_mail"
    android:paddingBottom="8dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:text="xyz@gmail.com"
    android:textColor="#a9a9a9"
    android:textSize="13sp" />
   </merge>

我在 main.xml 文件中使用上述布局,如下所示:-

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >

<LinearLayout
    android:layout_
    android:layout_
    android:background="#f7f7f7"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/tv_candidateInfoLbl"
        android:layout_
        android:layout_
        android:background="@color/blue"
        android:drawableEnd="@drawable/icon_check"
        android:drawableRight="@drawable/icon_check"
        android:padding="8dp"
        android:text="Candidate Information"
        android:textColor="@android:color/white"
        android:textSize="15sp" />

    <include
        android:id="@+id/view_candidateInfo"
        android:layout_
        android:layout_
        layout="@layout/include_interview_candidate_info" />
     </LinearLayout>
     </ScrollView>

在 MainActivity.java 文件中,当我尝试查找包含标记的 Id 时,我收到空指针异常。

    View view_candidateInfo= (View)findViewById(R.id.view_candidateInfo);
    view_candidateInfo.setVisibility(View.GONE);

【问题讨论】:

一个常见的错误是您正在使用的设备有特定的布局(基于某些资源,如屏幕尺寸或方向)。但我不确定 include 是否仍然存在,您可能需要将其放入组件中以隐藏它 这里没有使用合并布局。你可以使用LinearLayout 在这个answer 你可以看到这不适用于merge @arjun_sna 我知道使用 LinearLayout 也可以达到同样的效果,并且可以正常工作。但我想知道上面的代码sn-p有什么问题 膨胀后没有View ID view_candidateInfo&lt;merge&gt; 标签导致那些Views 被直接添加到&lt;include&gt; 的父代。如果xyz 布局有一个实际的根View,那么&lt;include&gt; ID 将覆盖根View 的ID,但这里不是这种情况。 xyz 没有根 View 【参考方案1】:

android doc 中有一个有趣的解释,说明merge 是为了防止多余的LinearLayout 所以包含替换include 标记。

来自Use the &lt;merge&gt; Tag

现在,当您将此布局包含在另一个布局中(使用标签)时,系统会忽略该元素并将两个按钮直接放置在布局中,代替标签。

所以你的标签include在视图中不存在,它被包含布局的组件(没有合并标签)替换。

您可以将其包含在具有 ID 的 View 中,也可以删除 merge

【讨论】:

【参考方案2】:

无需使用合并标签。 只需为 xyz.xml

使用 线性布局
<LinearLayout
android:layout_
android:layout_>

<TextView
    android:id="@+id/tv_candidateName"
    android:layout_
    android:layout_
    android:drawableLeft="@drawable/icon_candidate_name"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/icon_candidate_name"
    android:padding="8dp"
    android:text="Raju jain"
    android:textColor="@android:color/black"
    android:textSize="15sp" />

<TextView
    android:id="@+id/tv_candidateEmail"
    android:layout_
    android:layout_
    android:layout_marginTop="5dp"
    android:drawableLeft="@drawable/icon_mail"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/icon_mail"
    android:paddingBottom="8dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:text="xyz@gmail.com"
    android:textColor="#a9a9a9"
    android:textSize="13sp" />  </LinaerLayout>

然后将此布局包含在您的 ma​​in.xml 中;

<include    
android:id="@+id/layout_xyz"
layout="@layout/xyz" 
android:visibility="visible"/>

您可以通过编程方式将此布局设置为可见/不可见。

LinearLayout xyzLayout = (LinearLayout) findViewByid(R.id.layout_xyz);
xyzLayout.setVisibility(View.VISIBLE);

【讨论】:

以上是关于findViewById() 在与合并标签一起使用时在包含标签上抛出空指针的主要内容,如果未能解决你的问题,请参考以下文章

SecureCRT多标签合并(EVE-NG中tab标签合并一起)

如何在与 JGit 合并之前获得冲突?

为啥使用与父级一起声明的 std::function 在与子级一起使用时会显示错误?

为啥 .NET 通用主机在与 WinUI3 一起使用时不会停止?

在与 CASE 一起使用 THEN 语句后返回超过 1 个值

Zombie telnet 进程在与 Expect 一起使用 spawn 时堆积