Android: TextView setText работает только в первый раз

#android

#Android

Вопрос:

Каждый раз, когда вводится основное действие, приведенный ниже код будет выполняться и будет работать нормально (это означает indexStatus.setText(msg.obj.toString()); , что всегда отображается последнее сообщение об ошибке).

Но если я нажму back кнопку для выключения, а затем переключусь на тот же экран ( reBuildIndex снова запустится), Log.d(TAG, msg.obj.toString()); все работает нормально, распечатайте последнюю сообщение, но indexStatus.setText не работает, последняя сообщение отображается не так, как я ожидал.

Что здесь происходит? Есть предложения?

 void rebuildIndex(boolean reCreate) {
    final TextView indexStatus = (TextView) this.findViewById(R.id.index_status);
    indexStatus.setVisibility(View.INVISIBLE);
    indexStatus.setText(R.string.rebuild_index_progress_title);

    final Handler statusHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
      @Override
      public boolean handleMessage(Message msg) {
        if (msg.obj == null) {
          indexStatus.setVisibility(View.GONE);
        } else if (msg.obj.equals("show")) { // TODO quick demo, shouldn't use literal text.
          indexStatus.setVisibility(View.VISIBLE);
        } else {
          Log.d(TAG, msg.obj.toString());
          if (indexStatus.getVisibility() != View.VISIBLE) {
            indexStatus.setVisibility(View.VISIBLE);
          }
          indexStatus.setText(msg.obj.toString());
          indexStatus.invalidate();
        }
        return false;
      }
    });

    Indexer.rebuildIndexIfNecessary(statusHandler, reCreate);
  }
  

Обновить:

Я добавил indexStatus.invalidate(); after setText в третье условие, тоже не работает.

ОБНОВЛЕНИЕ: неправильное сообщение в исходном сообщении, я сказал нажать home , но на самом деле его back отключить. home кнопка включения / выключения работает нормально.

ОБНОВЛЕНИЕ: попытался поместить обработчик в качестве глобальной переменной, но не сработало. Теперь я отключил back событие.

Комментарии:

1. Это интересно. Могу ли я узнать, что вы видите (сообщение), когда оно работает не так, как ожидалось?

2. Можете ли вы дать немного больше информации о том, где rebuildIndex() снова вызывается? Это от onResume() ? что на самом деле запускает метод и что запускает the handleMessage() из Handler ?

3. rebuildIndex вызывается из onStart действия, а сообщение является обычным литералом String

4. @LightYearsBehind вообще ничего не отображается, кажется, что представление вообще не отображается

5. Мне кажется, что регистр «else» не вызывается, но вы сказали Log.d(...) , что работает.. Я полагаю, вы не звонили Log.d(...) в другое место?

Ответ №1:

Если TextView должен быть всегда установлен видимым в этой части кода:

 if (indexStatus.getVisibility() != View.VISIBLE) {
    indexStatus.setVisibility(View.VISIBLE);
}
  

затем удалите if часть.