在使用XML布局时,尝试将TextView动态添加到ScrollView会崩溃

时间:2011-02-17 13:45:25

标签: android

这是一个非常简单的例子,我在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元素,然后动态添加其他元素。

最好的方法是什么?

6 个答案:

答案 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);。目前scrollnull,因此我希望它会NullPointerException scroll.addView(tv1); {{1}}

答案 4 :(得分:1)

我遇到了你的问题。您需要在

之前设置contentView
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);

答案 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);