findViewById 在 LinearLayout 上返回 null

findViewById returning null on LinearLayout

我正在编写一个有很多视图的应用程序,然后根据您单击的视图更新视图。当我尝试查找布局以更新视图时,findViewById returns 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
}

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

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

第一。您还没有 LinearLayoutR.id.list_layout,这真的很愚蠢,因为您的项目正在制作并且它 returns NPE

你说你对这个android:id有那个看法。假设您有一个带有此 ID 的 TextView。我发誓,在那种情况下 Android Studio 不会说 NPE,而是说错误的视图属性,例如:

Hey rpurohit! There's no TextView matched with this id. Check please correctness of your configuration.

第二。你还说你有只有一种观点,就是这个LinearLayout。我只能说

Congratulations! You've found an issue!

并向您解释您正试图从您的母版 ViewGroup 中删除所有视图,但正如您所说:

The LinearLayout is the only thing that is inside the XML file.

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

我相信你现在明白了你的简单错误:-)

When you use layout.removeAllViews(). that means remove all child into the layout and dose not contain parent layout.

如果您有此代码:

  <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)。

If you wantremove child and parent view . You can use like this:

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