以编程方式添加到Android布局 - 然后访问从另一个方法创建的内容

时间:2011-04-21 17:05:48

标签: android layout

我正在以编程方式创建一个布局,需要添加一个TextView。唯一的问题是,我需要使TextView成为一个全局变量,以便可以在不同的方法中访问它(需要在别处调用setText()方法。)

ScrollView scroll = new ScrollView(this);
LinearLayout linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
scroll.addView(linear);

TextView time = new TextView(this);
time.setText("Some text");
linear.addView(time);

new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
    time.setText("seconds remaining: " + millisUntilFinished / 1000);
} // 'time' not accessible

public void onFinish() {
 time.setText("done!");
}
}.start(); */

this.setContentView(scroll);

所以我的问题是我正在创建'time'TextView,但CountDownTimer方法无法访问它。我尝试在构造函数的顶部使用TextView time = new TextView(this);,因为它是全局的,但这会导致异常 - “无法实例化活动ComponentInfo”和“null point exception”。该异常并未指明哪一行具体导致问题,但肯定是TextView timeLeft = new TextView(this);

2 个答案:

答案 0 :(得分:1)

我会在您的活动(mTime)中创建一个成员变量。然后CountDownTimer将能够随时访问成员变量。

或者,您可以声明time final:

final TextView time = new TextView(this);

答案 1 :(得分:0)

您可以先将id(例如:myTextViewId)分配给TextView,然后再将其添加到视图中,稍后您可以通过findViewById(myTextViewId);简单地引用该TextView

同样的情况,如果你使用xml文件膨胀你的TextView,并在其中分配一个id。然后,您可以通过findViewById(R.id.myTextView);引用该TextView。

或者最后,因为你不能同时使TextView final(它不会立即初始化,也不会在构造函数中)和class-level(私有,受保护等等)。 ,我建议你把它变成你班上的私人变量。

要访问它,你的方法应该在ui线程中运行,但是一个计时器有自己的线程,所以你应该使用Handler,并且从TimreTask的run方法中发送一个空消息给它。
Handler的{​​{1}}方法中,您可以安全地访问handleMessage(Message msg),无论是您的班级成员,还是仅知道其TextView