我正在以编程方式创建一个布局,需要添加一个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);
!
答案 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
。