如何更改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
  • 稍后在variablestselect布局的TextView
  • 你设置了t的文本(但要记住:只有 onCreate()完成并且应用程序的主要事件循环运行之后 ,才会显示它onCreate()
  • 你在onCreate方法中等待10秒 – 这绝不 onCreate因为它会停止所有的UI活动,并且肯定会强制ANR(Application Not Responding,请参阅上面的链接!)
  • 然后设置另一个文本 – 只要您的onCreate()方法完成并且其他几个Activity生命周期方法已经被处理,就会显示这个文本!

解决scheme:

  1. onCreate()只设置一次文本 – 这必须是第一个应该可见的文本。

  2. 创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(); 
  3. 安装这个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方法使事情不断更新。