【问题标题】:how to change text in Android TextView如何在 Android TextView 中更改文本
【发布时间】:2011-01-19 00:01:10
【问题描述】:

我试过这样做

@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() 方法阻塞有关。那么有人可以告诉我如何“异步”实现计时器吗?

谢谢。

【问题讨论】:

  • 它只显示第二行的原因是因为.setText() 用你告诉它设置的文本替换了整个“小部件”;包括您已经放在那里的文字。

标签: android textview


【解决方案1】:

@Zordid @Iambda 的回答很好,但我发现如果我把

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

在run()方法中和

mHandler.postDelayed(mUpdateUITimerTask, 0);

在 onCreate 方法中使事物不断更新。

【讨论】:

    【解决方案2】:

    根据您的建议,我正在使用句柄和 runnables 使用“计时器”来切换/更改 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);      
        ...
    }
    

    【讨论】:

    • 这行不通!只有一个处理程序 - 您如何希望您唯一现有的 mWaitRunnable 跑步者“知道” sText 曾经设置为“第二步”然后设置为“第三步”!!??到第一次调用时(3 秒后)- sText 的值就是“第三步”!在尝试 Android 编程之前,您应该熟悉基本的 Java 技能! :-)
    • 其实我最后做的是在runnable里面加了一个计数器,如果是1,文本就是这个,如果是2,文本就是这个,等等。
    【解决方案3】:

    两次将文本设置为 sam textview 会覆盖第一个书面文本。 所以当我们第二次使用 settext 时,我们只是追加新的字符串,比如

    textview.append("Step Two: fry egg");
    

    【讨论】:

      【解决方案4】:

      我刚刚在 android-discuss google 群中发布了这个答案

      如果您只是想在视图中添加文本以使其显示“第一步:炸鸡蛋第二步:煎鸡蛋”,那么请考虑使用t.appendText("Step Two: fry egg"); 而不是t.setText("Step Two: fry egg");

      如果您想完全更改 TextView 中的内容,使其在启动时显示“第一步:炸鸡蛋”,然后稍后显示“第二步:煎鸡蛋”,您可以随时使用

      sadboy 给出的可运行示例

      祝你好运

      【讨论】:

        【解决方案5】:

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

        1) onCreate 准备您的活动 - 所以在此方法完成之前,您在此处所做的任何操作都不会对用户可见!例如 - 您将永远无法在此处更改 TextView 的文本超过 ONE 次,因为只会绘制最后一次更改,因此用户可以看到!

        2) 请记住,Android 程序将 - 默认情况下 - 仅在 ONE 线程中运行!因此:永远不要在负责 UI 的主线程中使用 Thread.sleep()Thread.wait()! (阅读"Keep your App Responsive"了解更多信息!)

        您的 Activity 初始化所做的是:

        • 你无缘无故地创建了一个新的TextView对象t
        • 稍后在变量t 中选择布局的TextView
        • 您设置了t 的文本(但请记住:它只会在 onCreate() 完成并且您的应用程序的主事件循环运行后才会显示!)
        • 您在 onCreate 方法中等待 10 秒 - 这绝对不能这样做,因为它会停止所有 UI 活动并且肯定会强制 ANR(应用程序无响应) ,见上面的链接!)
        • 然后您设置另一个文本 - 当您的 onCreate() 方法完成并且其他几个 Activity lifecycle 方法已处理完毕后,该文本将立即显示!

        解决办法:

        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();
          
        3. 将此可运行对象安装为处理程序,可以在onCreate() 中安装(但请阅读我的以下建议):

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

        建议:确保您了解Activity 的生命周期!如果您在onCreate() 中执行此类操作,则只有在您的Activity第一次创建时才会发生! Android 可能会让您的Activity 存活更长时间,即使它不可见! 当用户再次“启动”它时——它仍然存在——你将不再看到你的第一个文本!


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

        【讨论】:

          【解决方案6】:

          :) 您以错误的方式使用线程。 只需执行以下操作:

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

          就是这样。

          【讨论】:

            【解决方案7】:

            @user264892

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

            所以而不是:

            String Status = "Asking Server...";
            txtStatus.setText(Status);
            

            尝试:

            String Status = "Asking Server...";
            txtStatus.setText((CharSequence) Status);
            

            或:

            String Status = "Asking Server...";    
            txtStatus.setText("" + Status);
            

            或者,由于您的字符串不是动态的,因此更好:

            txtStatus.setText("AskingServer...");
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-28
                • 1970-01-01
                • 2019-06-03
                • 1970-01-01
                • 2013-08-06
                • 1970-01-01
                相关资源
                最近更新 更多