我的布局如下:
我们将它命名为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-land
和my_layout.xml
。
但有时在活动重启/创建时我会在初始化来自NullpointerException
的{{1}}时获得activity_listView
。
我知道:
我们得到的
R.java
与我提出的问题类似 元素在任何布局文件夹中都不存在(即它存在于layout-land中但在布局文件夹中不存在)。
但是在这里,元素存在于两个文件夹中,即使我得到了这个不一致的错误 即我总是无法生产它,但有时它会开始产生。
所以,请帮助我分析一下,除了我上面提到的那个错误之外,还有什么原因可以解释。
提前致谢。
答案 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
来清理项目并更正错误的引用。