我有一个名为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
答案 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中声明您的活动