我正在编写一个包含许多视图的应用程序,然后根据您单击的视图,它将更新视图。当我尝试找到更新视图的布局时,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
}
我该怎么做才能解决这个问题?我怀疑它与布局膨胀有关,但我不确定。
答案 0 :(得分:1)
就个人而言,我只看到NPE
(空指针异常)的两个原因:
第一的。您还没有LinearLayout
与R.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();