【问题标题】:findViewById returning null on LinearLayoutfindViewById 在 LinearLayout 上返回 null
【发布时间】:2015-12-17 04:27:58
【问题描述】:

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

我可以做些什么来解决这个问题?我怀疑这与布局膨胀有关,但我不确定。

【问题讨论】:

  • 我敢打赌,在您的布局 XML 文件中,LinearLayout 标记中没有 android:id="@+id/list_layout"
  • 我愿意。我有一个 不过,这些只是其中的几个属性。
  • LinearLayout 是 XML 文件中唯一的内容。
  • 并且有 id list_layout??
  • 是的,布局确实有list_layout。

标签: java android android-layout findviewbyid


【解决方案1】:

我个人认为NPE(空指针异常)的原因只有两个:

首先。你还没有LinearLayoutR.id.list_layout,这真的很愚蠢,因为你的项目正在制作中,它返回NPE

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

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

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

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

并向您解释您正在尝试从您的主人ViewGroup 中删除所有视图,但就像您说的那样:

LinearLayout 是 XML 文件中唯一的内容。

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

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

【讨论】:

    【解决方案2】:

    当你使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多