在使用findViewById(R.id。*)获取时,在什么情况下布局元素为null?

时间:2014-07-24 12:56:48

标签: android android-layout nullpointerexception r.java-file

我的布局如下:

我们将它命名为my_layout.xml: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp" 
         android:textColor="#ffffff"
        android:background="#19396a"
        />

    <TextView
        android:id="@+id/textView2"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="20sp"
         android:textColor="#ffffff"
        android:background="#19396a"
         />
    </LinearLayout>
    <ListView
        android:id="@+id/uilistView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

在我的活动中,我有一个方法,我初始化所有UI元素,即我将活动UI变量映射到布局。

假设,方法如下: -

//used to initialize UI elements
//called in oncreate() method
public void initializeUIelements() {
......
activity_listView = (ListView) findViewById(R.id.uilistView);
}

此处,activity_listView是类型ListView

的类级变量

在我的项目中,我在两个文件夹中都存在res\layout以及res\layout-landmy_layout.xml

但有时在活动重启/创建时我会在初始化来自NullpointerException的{​​{1}}时获得activity_listView

我知道:

  

我们得到的R.java与我提出的问题类似   元素在任何布局文件夹中都不存在(即它存在于layout-land中但在布局文件夹中不存在)。

但是在这里,元素存在于两个文件夹中,即使我得到了这个不一致的错误 即我总是无法生产它,但有时它会开始产生。

所以,请帮助我分析一下,除了我上面提到的那个错误之外,还有什么原因可以解释。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您可以提供更具体的示例,则可能更容易调试确切的问题。您的View可能为null的几个原因:

您设置为内容视图的布局不包含具有此ID的视图:

如果引用R文件中存在的视图(包含对res文件夹中所有元素的引用的文件),请说uilistview,在未设置其布局的活动中容器作为内容视图(在这种情况下,这将是my_layout.xml),您将不会在Eclipse或您使用的任何IDE中收到错误。 Android将在布局中查找具有此id的视图,如果找不到,则返回空值。

您过早调用findViewById

在尝试使用setContentView(R.layout.some_layout)访问任何元素之前,必须使用方法findViewById()。从逻辑上讲,它是有道理的 - 你需要告诉Android它应该在哪里找到一个元素

在充气的视图中查找元素

这与第一种相似,但很常见。如果您已经对视图进行了充气,​​然后想要在充气视图中操纵视图,则必须指示Android查看正确的位置。例如:

RLayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View smallerView = layoutInflater.inflate(R.layout.mylayout);

如果你想引用mylayout.xml中的内容,你需要使用它:

TextView text = (TextView) smallerView.findViewById(R.id.text_view);

而不是:

TextView text = (TextView) findViewById(R.id.text_view);

第一个表示通过将findViewById方法放在膨胀视图上来查看膨胀视图,而第二个方法将其应用于当前活动视图,这将导致返回空值。

清理项目

这是最令人沮丧的答案,因为这不是你的错。有时候R.java类会在编译/构建时弄乱并导致对id的错误引用。尝试通过在Eclipse主条(或您正在使用的IDE)中查找Project -> Clean来清理项目并更正错误的引用。