这是一个非常简单的例子,我在R.layout.main中定义了一个ScrollView。然后我尝试动态添加TextView。
不幸的是,这会崩溃。
ScrollView scroll = (ScrollView) this.findViewById(R.id.scrollView1);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
setContentView(R.layout.main);
现在我可以做这样的事情:
ScrollView scroll = new ScrollView(this);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
setContentView(scroll);
但我真的希望能够在XML中定义一些基本UI元素,然后动态添加其他元素。
最好的方法是什么?
答案 0 :(得分:11)
这是因为您正在尝试访问尚未被Android解析的视图。
使用XML定义布局时,必须先调用setContentView
,然后将布局文件引用传递给它,以便Android可以解析文件。只有这样,您才能使用findViewById
访问元素。
这基本上意味着您应该在尝试访问布局的任何元素之前调用setContentView
。
答案 1 :(得分:2)
在对任何视图执行任何其他操作之前,必须先调用setContentView。
这应该有用。
setContentView(R.layout.main);
ScrollView scroll = (ScrollView) this.findViewById(R.id.scrollView1);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
答案 2 :(得分:2)
另一种方法,
您可以在LinearLayout
内创建新的ScrollView
,并将ID设置为layoutinside
现在
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout) findViewById(R.id.layoutinside);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
ll.addView(tv1);
这对我来说很好
答案 3 :(得分:1)
findViewById
后才能调用<{setContentView(R.layout.main);
。目前scroll
将null
,因此我希望它会NullPointerException
scroll.addView(tv1);
{{1}}
答案 4 :(得分:1)
我遇到了你的问题。您需要在
之前设置contentViewsetContentView(R.layout.main);
ScrollView scroll = (ScrollView) this.findViewById(R.id.scrollView1);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
答案 5 :(得分:0)
虽然开头需要setContentView()
是问题的一部分,但事实证明它不是异常的来源。
引发的实际异常是IllegalStateException "Scrollview can host only one direct child"
(评论中提及Javanator)
当我查看ScrollView的XML时,它看起来像这样。当ScrollView添加到布局时,Eclipse会自动添加LinearLayout:
<ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_height="match_parent"></LinearLayout>
</ScrollView>
因此,有两种方法可以解决异常问题:
1)从ScrollView内部删除LinearLayout。然后,在将我的呼叫转移到setContentView
后,我的问题中的代码可以正常工作。
2)我可以将TextView添加到LinearLayout而不是将TextView添加到ScrollView:
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout) this.findViewById(R.id.linearLayout1);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
ll.addView(tv1);