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
(空指针异常)的两个原因:
第一。您还没有 LinearLayout
和 R.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();
我正在编写一个有很多视图的应用程序,然后根据您单击的视图更新视图。当我尝试查找布局以更新视图时,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
(空指针异常)的两个原因:
第一。您还没有 LinearLayout
和 R.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();