findViewById在LinearLayout上返回null

时间:2015-12-14 01:30:10

标签: java android android-layout findviewbyid

我正在编写一个包含许多视图的应用程序,然后根据您单击的视图,它将更新视图。当我尝试找到更新视图的布局时,findViewById返回null。仅供参考:我从onCreate()调用的函数调用findViewById。是的,我在调用该函数之前调用了setContentView。 MainActivity.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    updateViews();

}


public void updateViews(){
     LinearLayout layout = (LinearLayout) findViewById(R.id.list_layout);
    layout.removeAllViews(); //NPE: Attempt to invoke virtual method 'android.widget.LinearLayout.removeAllViews()' on a null object reference
}

我该怎么做才能解决这个问题?我怀疑它与布局膨胀有关,但我不确定。

2 个答案:

答案 0 :(得分:1)

就个人而言,我只看到NPE(空指针异常)的两个原因:

第一的。您还没有LinearLayoutR.id.list_layout这是非常愚蠢的,因为您的项目正在制作并返回NPE

你说你有android:id的观点。假设你有TextView这个id。我发誓,在这种情况下,Android Studio不会说NPE,而是关于错误的视图属性,例如:

  嘿rpurohit!没有与此ID匹配的TextView。请检查您的配置是否正确。

第二。您还说明了一个视图,即LinearLayout。我只能说

  

恭喜!你发现了一个问题!

并向您解释说您正在尝试删除主ViewGroup中的所有观看次数,但就像您说的那样:

  

LinearLayout是XML文件中唯一的东西。

因此您的IDE尝试从其父级中删除任何视图,但由于没有ChildViews,它会告诉您有关空指针异常的信息。

我确信现在你理解了你的简单错误: - )

答案 1 :(得分:0)

  

使用layout.removeAllViews()时。这意味着删除所有孩子   进入布局,剂量不包含父布局。

如果您有此代码:

  <Linearlayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:id="@+id/layout"
        android:background="@android:color/holo_blue_dark">

        <ToggleButton
            android:id="@+id/toggleButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ToggleButton" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    </Linearlayout>

并调用layout.removeAllViews()方法。这删除textView和toggleButton但不删除父布局(布局ID)。

  

如果要删除子视图和父视图。您可以这样使用:

 ((ViewGroup)layout.getParent()).removeAllViews();