2011-04-21 53 views
0

我以编程方式创建布局,并且需要添加一个TextView。唯一的问题是,我需要使TextView成为一个全局变量,因此可以在不同的方法中访问它(需要在别处调用setText()方法)。以编程方式添加到Android布局 - 然后访问从另一个方法创建的内容

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

所以我的问题是我创建'时间'TextView但CountDownTimer方法无法访问它。我尝试使用构造函数的TextView time = new TextView(this);作为全局代码,但是这会导致异常 - “无法实例化活动ComponentInfo”和“空点异常”。这个例外并不表示哪条线特别引起问题,但确实是TextView timeLeft = new TextView(this);

+0

为什么不使用XML布局文件来定义视图?只是好奇。 – Squonk 2011-04-21 17:18:26

+0

另外,在你的代码中你调用了setContentView? – Squonk 2011-04-21 17:28:04

+0

这只是代码的一部分(我遇到问题的部分)。我之前以编程方式创建布局作为不确定数量的按钮的原因被添加到它之前。 setContentView是(如上所述),位于每个按钮后面的代码底部,并将'time' TextView添加到布局中。 – james246 2011-04-21 17:33:08

回答

1

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

或者,你可以声明time决赛:

final TextView time = new TextView(this); 
+0

现在通过将'time'声明为'final'来完成它,可以这样做吗? 'time'被修改,每当计时器滴答下来,因为它是一个倒数计时器。我对于最终变量的作用有些困惑,因为它似乎很高兴地修改它。更好地得到维基百科,并阅读我想! – james246 2011-04-21 17:27:54

0

你可以指定一个id(比如:myTextViewId)您TextView将其添加到视图之前,以后你可以简单地通过findViewById(myTextViewId);指的TextView 。

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

最后,因为你不能使TextView都final(它不会立即初始化,也不在构造函数中)和class-level(私人,受保护等),我建议做它是你的类中的一个私有变量。

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

相关问题