findViewById()在使用merge标记时在include标记上抛出空指针

时间:2017-02-02 09:32:32

标签: java android xml nullpointerexception

我正在尝试使用include标记将一个布局(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_width="fill_parent"
    android:layout_height="wrap_content"
    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_width="fill_parent"
    android:layout_height="wrap_content"
    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_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#f7f7f7"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/tv_candidateInfoLbl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        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_width="match_parent"
        android:layout_height="wrap_content"
        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);

2 个答案:

答案 0 :(得分:2)

android doc解释中有一个有趣的解释,merge是为了防止重新加密LinearLayout,因此包含会替换include标记。

来自Use the <merge> Tag

  

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

因此,您的标记include在视图中不存在,它将被包含的布局的组件(没有合并标记)替换。

您可以将其添加到具有ID的View或删除merge

答案 1 :(得分:0)

无需使用合并标记。 只需对 xyz.xml

使用线性布局
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/tv_candidateName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    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_width="fill_parent"
    android:layout_height="wrap_content"
    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);