如何更改Android TextView中的文本
我试图做到这一点
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t=new TextView(this); t=(TextView)findViewById(R.id.TextView01); t.setText("Step One: blast egg"); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t.setText("Step Two: fry egg");
但由于某种原因,只有第二个文本显示出来,当我运行它。 我认为这可能与Thread.sleep()
方法阻塞有关。 那么有人可以告诉我如何实现“asynchronous”的计时器?
谢谢。
我刚刚在Android的讨论谷歌组发布这个答案
如果你只是想添加文本到视图,以便它显示“第一步:爆炸鸡蛋第二步:炒鸡蛋”然后考虑使用t.appendText("Step Two: fry egg");
而不是t.setText("Step Two: fry egg");
如果你想完全改变TextView
,在启动时就会显示“Step One:blast egg”,然后说“Step Two:Fry egg”,之后你可以使用
可悲的例子sadboy给了
祝你好运
你的onCreate()
方法有几个巨大的缺陷:
1) onCreate
准备你的活动 – 所以在这里你做的任何事情都将会被用户看到 ,直到这个方法结束! 例如 – 您将永远无法在一次以上的时间内更改TextView
的文本,因为只有最后一次更改将被绘制,因此对用户可见!
2)请记住,一个Android程序将 – 默认情况下 – 只能在一个线程中运行! 因此:永远不要在你的主线程中使用Thread.sleep()
或Thread.wait()
来负责你的UI! (请阅读“保持您的应用程序响应”获取更多信息!)
你的Activity的初始化是:
- 没有理由你创build一个新的
TextView
对象t
! - 稍后在variables
t
select布局的TextView
。 - 你设置了
t
的文本(但要记住:只有在onCreate()
完成并且应用程序的主要事件循环运行之后 ,才会显示它onCreate()
! - 你在
onCreate
方法中等待10秒 – 这绝不onCreate
因为它会停止所有的UI活动,并且肯定会强制ANR(Application Not Responding,请参阅上面的链接!) - 然后设置另一个文本 – 只要您的
onCreate()
方法完成并且其他几个Activity生命周期方法已经被处理,就会显示这个文本!
解决scheme:
-
在
onCreate()
只设置一次文本 – 这必须是第一个应该可见的文本。 -
创build一个
Runnable
和一个Handler
private final Runnable mUpdateUITimerTask = new Runnable() { public void run() { // do whatever you want to change here, like: t.setText("Second text to display!"); } }; private final Handler mHandler = new Handler();
-
安装这个runnable作为处理程序,可能在
onCreate()
(但请阅读我的build议下面):// run the mUpdateUITimerTask's run() method in 10 seconds from now mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
build议:确保你知道一个Activity
的生命周期! 如果你在onCreate()
做这样的事情,这只会在你的Activity
第一次被创build时发生! Android可能会保持Activity
更长的时间,即使它不可见! 当用户再次“启动”它 – 它仍然存在 – 你不会看到你的第一个文本了!
=>总是在onResume()
安装处理程序并在onPause()
禁用它们! 否则,当您的Activity
完全不可见时,您将获得“更新”! 在你的情况下,如果你想在重新激活时再次看到你的第一个文本,你必须设置onResume()
,而不是onCreate()
!
新文本视图的第一行是不必要的
t=new TextView(this);
你可以做到这一点
TextView t = (TextView)findViewById(R.id.TextView01);
至于在这里睡觉的后台线程是一个例子,但我认为有一个计时器,这将是更好的。 这里是一个很好的例子使用定时器的链接http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask); thr.start(); } Runnable mTask = new Runnable() { public void run() { // just sleep for 30 seconds. try { Thread.sleep(3000); runOnUiThread(done); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable done = new Runnable() { public void run() { // t.setText("done"); } };
@ user264892
我发现,当使用一个stringvariables,我需要前缀的string的“”或显式强制转换为CharSequence。
所以,而不是:
String Status = "Asking Server..."; txtStatus.setText(Status);
尝试:
String Status = "Asking Server..."; txtStatus.setText((CharSequence) Status);
要么:
String Status = "Asking Server..."; txtStatus.setText("" + Status);
或者,因为你的string不是dynamic的,甚至更好:
txtStatus.setText("AskingServer...");
根据您的build议,我正在使用句柄和可运行的开关/更改TextView的内容使用“计时器”。 出于某种原因,运行时,应用程序总是跳过第二步(“第二步:炒鸡蛋”),只显示最后一步(第三步)(“第三步:服务鸡蛋”)。
TextView t; private String sText; private Handler mHandler = new Handler(); private Runnable mWaitRunnable = new Runnable() { public void run() { t.setText(sText); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMonster = BitmapFactory.decodeResource(getResources(), R.drawable.monster1); t=new TextView(this); t=(TextView)findViewById(R.id.TextView01); sText = "Step One: unpack egg"; t.setText(sText); sText = "Step Two: fry egg"; mHandler.postDelayed(mWaitRunnable, 3000); sText = "Step three: serve egg"; mHandler.postDelayed(mWaitRunnable, 4000); ... }
:)你用错误的方式使用线程。 只要做到以下几点:
private void runthread() { splashTread = new Thread() { @Override public void run() { try { synchronized(this){ //wait 5 sec wait(_splashTime); } } catch(InterruptedException e) {} finally { //call the handler to set the text } } }; splashTread.start(); }
而已。
将文本设置为sam textview将覆盖第一个写入的文本。 所以第二次当我们使用settext时,我们只是追加新的string
textview.append("Step Two: fry egg");
@Zordid @Iambda答案很好,但是我发现如果我放
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
在run()方法中
mHandler.postDelayed(mUpdateUITimerTask, 0);
在onCreate方法使事情不断更新。