为什么我一直得到我的LinearLayout的空引用?

时间:2012-10-25 09:35:09

标签: android android-layout

我有一个名为view.xml的布局,其中包含一个名为View的{​​{1}}。基本上,在我的词典应用程序中,如果条目中有相关的单词,我会将view_related替换为包含标题“相关条目”的view_related和一堆LinearLayout s代表每个相关的词。

每当我在TextView的{​​{1}}方法中向NullPointerException添加TextView时,我就会LinearLayout继续Activity理解为什么我的代码看起来非常简单。

view.xml用

onCreate()

view_related.xml,<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/view_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="12pt" android:textColor="#fff" android:textStyle="bold" android:background="#990011" android:padding="10dp" android:text="lalala word" /> <ScrollView android:id="@+id/view_description" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/view_header"> <LinearLayout android:id="@+id/view_description_content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:text="@string/demo_definition" /> <!-- THIS WILL BE REPLACED --> <View android:id="@+id/view_related" android:layout_width="match_parent" android:layout_height="wrap_content"></View> </LinearLayout> </ScrollView> </RelativeLayout> 将替换view.xml中的LinearLayout元素

View

最后,<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/view_related_entries" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/view_related_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:textColor="#fff" android:textStyle="bold" android:textSize="7pt" android:background="#000" android:text="Related entries" /> <LinearLayout android:id="@+id/view_related_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </LinearLayout> </LinearLayout> 方法,现在假定相关条目为“Hello”和“Goodbye:”

onCreate

5 个答案:

答案 0 :(得分:2)

setContentView(R.layout.view);
LinearLayout ll = (LinearLayout) findViewById(R.id.view_related_list);

函数findViewById仅查找实际设置的视图。您当前的setContentView未设置具有您要查找的ID的xml,因此我引用的第一行不会产生任何结果。

您应该加载正确的XML,或者使用inflater为您正在寻找的视图充气

答案 1 :(得分:1)

该行(LinearLayout ll = (LinearLayout) findViewById(R.id.view_related_list);)会在view_related_list中搜索view.xml,就像之前的行是您正在使用的视图一样..

您需要先升级view_related.xml,然后从中获取视图..

答案 2 :(得分:1)

你在代码中做了很多错误的事情。首先,您搜索不在当前布局中的LinearLayout,并且此时也不在任何虚增布局中。其次,您尝试夸大id引用而不是layout引用。最后,你应该使用另一种方法来做你想做的事情。你的代码应该是(根据我的理解):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);   

    LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View view = findViewById(R.id.view_related);
    ViewGroup parent = (ViewGroup) view.getParent();
    int index = parent.indexOfChild(view);
    parent.removeView(view);
    View llview = li.inflate(R.layout.view_related, parent, false); // is view_related the name of the extra layout file?
    parent.addView(llview, index);
    LinearLayout ll = (LinearLayout) findViewById(R.id.view_related_list); // or search for it in llview, llview.findViewById(R.id.view_related_list);
    TextView tv = new TextView(this);
    tv.setText("Hello");
    ll.addView(tv); // NULL POINTER EXCEPTION

    tv = new TextView(this);
    tv.setText("Goodbye");
    ll.addView(tv);
}

这种情况应该使用ViewStub添加新的布局文件。虽然,我不明白为什么不在view.xml中直接添加新的布局文件,如果你要在onCreate方法中添加布局的内容。

答案 3 :(得分:0)

我认为您需要使用setContentView(R.layout.view_related);代替setContentView(R.layout.view);

或者您可以做的另一件简单的事情是在同一布局“视图”中采用线性布局,并在不需要时使其不可见,并在需要时可见

答案 4 :(得分:-1)

您可能忘记在manifest.xml中声明您的活动