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

Спасибо.

91
задан lambda 2 March 2013 в 18:06
поделиться

4 ответа

Я только что опубликовал этот ответ в google-группе android-discuss

Если вы просто пытаетесь добавить текст в представление, чтобы оно отображало "Step One: blast egg Step Two: fry egg" Then consider using t.appendText("Step Two: fry egg"); instead of t. setText("Step Two: fry egg");

Если вы хотите полностью изменить то, что находится в TextView так, чтобы он говорил "Step One: blast egg" при запуске, а затем говорил "Step Two: fry egg" через некоторое время, вы всегда можете использовать

Runnable пример, который дал sadboy

Удачи

.
45
ответ дан 24 November 2019 в 06:43
поделиться

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

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");
            }
        };
14
ответ дан 24 November 2019 в 06:43
поделиться

по вашему совету, я использую дескриптор и 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);      
    ...
}
3
ответ дан 24 November 2019 в 06:43
поделиться

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

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

2) Помните, что программа Android по умолчанию запускается только в ОДНОМ потоке! Таким образом: никогда не используйте Thread.sleep () или Thread.wait () в вашем основном потоке, который отвечает за ваш пользовательский интерфейс! (прочтите «Поддерживайте адаптивность вашего приложения» для получения дополнительной информации!)

Что делает ваша инициализация вашей Activity:

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

Решение:

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

  2. Создайте Runnable и Handler

     private final Runnable mUpdateUITimerTask = new Runnable () {
    public void run () {
     // делаем все, что вы хотите здесь изменить, например: 
    t.setText ("Второй текст для отображения!"); 
    } 
    }; 
    частный обработчик финала mHandler = new Handler (); 
     
  3. установить этот исполняемый файл как обработчик, возможно в onCreate () (но прочтите мой совет ниже):

     // запускаем run () mUpdateUITimerTask через 10 секунд 
    mHandler.postDelayed (mUpdateUITimerTask, 10 * 1000); 
     

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


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

147
ответ дан 24 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: