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
。 <merge>
标签导致那些View
s 被直接添加到<include>
的父代。如果xyz
布局有一个实际的根View
,那么<include>
ID 将覆盖根View
的ID,但这里不是这种情况。 xyz
没有根 View
。
【参考方案1】:
android doc 中有一个有趣的解释,说明merge
是为了防止多余的LinearLayout
所以包含替换include
标记。
来自Use the <merge> 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>
然后将此布局包含在您的 main.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标签合并一起)
为啥使用与父级一起声明的 std::function 在与子级一起使用时会显示错误?
为啥 .NET 通用主机在与 WinUI3 一起使用时不会停止?