Как изменить текст в 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(). Так может ли кто-нибудь показать мне, как реализовать таймер "асинхронно"?

Спасибо.

Ответ 1

Я только что разместил этот ответ в андроид-обсуждении группы google

Если вы просто пытаетесь добавить текст в представление, чтобы он отображал "Шаг первый: взрывающееся яйцо Шаг второй: обжарьте яйцо". Затем рассмотрите возможность использования t.appendText("Step Two: fry egg"); вместо t.setText("Step Two: fry egg");

Если вы хотите полностью изменить то, что находится в TextView, так что он говорит "Шаг первый: взрывное яйцо" при запуске, а затем он говорит "Шаг второй: обжарьте яйцо", а затем вы всегда можете использовать

Runnable example sadboy дал

Удачи.

Ответ 2

Ваш метод onCreate() имеет несколько огромных недостатков:

1) onCreate готовит вашу активность - поэтому ничего, что вы здесь сделаете, будет сделано видимо для пользователя, пока этот метод не завершится! Например, вы никогда не сможете изменить текст TextView здесь больше, чем ОДИН, так как будет отображаться только последнее изменение и, таким образом, видимое пользователю!

2) Имейте в виду, что программа Android по умолчанию работает только в потоке ONE! Таким образом: никогда не используйте Thread.sleep() или Thread.wait() в своем основном потоке, который отвечает за ваш интерфейс! (прочитайте "Keep your App Отзыв" для получения дополнительной информации!)

Что означает ваша инициализация вашей активности:

  • по какой-либо причине вы создаете новый объект TextView t!
  • вы выберете свой макет TextView в переменной t позже.
  • вы устанавливаете текст t (но имейте в виду: он будет отображаться только после завершения onCreate() и запускается цикл основного события вашего приложения!)
  • вы ожидаете 10 секунд в своем методе onCreate - этот никогда не должен выполняться, поскольку он останавливает все действия пользовательского интерфейса и определенно принуждает ANR (приложение не отвечает, см. ссылку выше!)
  • то вы установите другой текст - этот будет отображаться, как только закончится ваш метод onCreate(), и несколько других методов жизненного цикла активности были обрабатываются!

Решение:

  • Установите текст только один раз в onCreate() - это должен быть первый текст, который должен быть видимым.

  • Создайте 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() (но прочтите мой совет ниже):

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

Совет: убедитесь, что знаете жизненный цикл Activity! Если вы делаете что-то вроде этого в onCreate(), это произойдет только тогда, когда ваш Activity будет создан первым! Android, возможно, сохранит ваш Activity живым в течение более длительного периода времени, даже если он не будет виден! Когда пользователь "запускает" его снова - и он все еще существует, вы больше не увидите свой первый текст!


= > Всегда устанавливайте обработчики в onResume() и отключите их в onPause()! В противном случае вы получите "обновления", когда ваш Activity не будет виден вообще! В вашем случае, если вы хотите снова увидеть свой первый текст, когда он будет повторно активирован, вы должны установить его в onResume(), а не onCreate()!

Ответ 3

Первая строка нового текстового представления не нужна

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

Ответ 4

@user264892

Я обнаружил, что при использовании переменной String мне нужно было либо префикс с String из "", либо явно передать 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...");

Ответ 5

за ваш совет, я использую дескриптор и 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);      
    ...
}

Ответ 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

установка текста в текстовое окно sam дважды перезаписывает первый письменный текст. Поэтому во второй раз, когда мы используем settext, мы просто добавляем новую строку, например

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

Ответ 8

@Zordid @Iambda ответ велик, но я обнаружил, что если я поставлю

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

в методе run() и

mHandler.postDelayed(mUpdateUITimerTask, 0);

в методе onCreate обновить вещь.