如何在Android TextView中更改文本

use*_*811 91 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");
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,我运行时只显示第二个文本.我认为它可能与Thread.sleep()方法阻塞有关.那么有人能告诉我如何"异步"实现定时器吗?

谢谢.

Zor*_*did 147

你的onCreate()方法有几个巨大的缺陷:

1)onCreate 准备你的活动 - 所以在这个方法完成之前,你在这里做的任何事情都不会被用户看到!例如-你将永远无法改变TextView这里的文本超过ONE,因为只有最后一次更改将绘制时间,从而对用户可见!

2)请记住,Android程序 - 默认情况下 - 只在一个线程中运行!因此:永远不要使用Thread.sleep()Thread.wait()在您的主线程中负责您的UI!(阅读"保持应用程序响应"以获取更多信息!)

你的初始化你的活动所做的是:

  • 无缘无故你创建一个新TextView对象t!
  • 你稍后TextView在变量中选择你的布局t.
  • 你设置文本t(但请记住:它只会 onCreate()完成显示,并且应用程序的主事件循环运行!)
  • 你在方法中等待10秒onCreate - 这绝不能完成,因为它会停止所有UI活动,并且肯定会强制ANR(应用程序无响应,请参阅上面的链接!)
  • 然后你设置另一个文本 - 一旦你的onCreate()方法完成并且处理了其他几个Activity生命周期方法,这个文本就会显示出来!

解决方案:

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

  2. 创建一个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();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装这个runnable作为处理程序,可能在onCreate()(但请阅读我的建议):

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
    
    Run Code Online (Sandbox Code Playgroud)

建议:确保你知道一个Activity人的生命周期!如果你做这样的事情onCreate()只会Activity一次创建时发生!Activity即使它不可见,Android也可能会让你活着更长时间!当用户再次"启动"它 - 它仍然存在 - 您将不再看到您的第一个文本!


=>始终安装处理程序onResume()并禁用它们onPause()!否则,当您Activity根本看不到时,您将获得"更新" !在您的情况下,如果您想在重新激活时再次看到第一个文本,则必须将其设置为onResume(),而不是onCreate()!


snc*_*tln 45

我刚刚在android-discuss谷歌小组中发布了这个答案

如果您只是想在视图中添加文本以便显示"第一步:爆蛋第二步:煎鸡蛋"然后考虑使用t.appendText("Step Two: fry egg"); 而不是t.setText("Step Two: fry egg");

如果你想完全改变TextView它的内容,那么在启动时它会说"第一步:爆蛋"然后它会说"第二步:煎鸡蛋",之后你可以随时使用

Runnable示例sadboy给了

祝好运


Pat*_*fka 14

新文本视图的第一行是不必要的

t=new TextView(this); 
Run Code Online (Sandbox Code Playgroud)

你可以这样做

TextView t = (TextView)findViewById(R.id.TextView01);
Run Code Online (Sandbox Code Playgroud)

至于睡在这里的后台线程是一个例子,但我认为有一个更好的计时器.这里是使用计时器的一个很好的例子的链接,而不是 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");
            }
        };
Run Code Online (Sandbox Code Playgroud)


jwa*_*n85 6

@ user264892

我发现当使用String变量时,我需要使用字符串""前缀或显式强制转换为CharSequence.

所以代替:

String Status = "Asking Server...";
txtStatus.setText(Status);
Run Code Online (Sandbox Code Playgroud)

尝试:

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);
Run Code Online (Sandbox Code Playgroud)

要么:

String Status = "Asking Server...";    
txtStatus.setText("" + Status);
Run Code Online (Sandbox Code Playgroud)

或者,因为你的字符串不是动态的,甚至更好:

txtStatus.setText("AskingServer...");
Run Code Online (Sandbox Code Playgroud)