Android сохраняет состояние обратного вызова после изменения конфигурации - PullRequest
6 голосов
/ 17 мая 2011

Я прекрасно понимаю жизненный цикл Android. Я пишу здесь, потому что я заметил одно странное поведение, так или иначе, это моя собственная мысль.

Мой случай таков: одно упражнение будет использовать простой макет с одним EditText. В методе действия onCreate я устанавливаю некоторый текст по умолчанию для EditText, а в более поздней части метода назначаю TextWatcher для EditText, поэтому, когда пользователь вводит что-либо, я могу ответить по-своему .

Все в порядке, пока я не поверну экран. Обратный вызов TextWatcher начинает реагировать на код, который инициализирует EditText.

В соответствии с обычным потоком кода TextWatcher назначается позже после инициализации текстового значения EditText. поэтому он не должен запускаться из-за назначения текста в методе onCreate.

Может ли кто-нибудь здесь объяснить это?

Ответы [ 2 ]

8 голосов
/ 17 мая 2011

Вот почему вы видите это поведение:

  1. Когда метод 'onCreate' вызывается впервые, он не имеет сохраненного состояния.Это означает, что параметр Bundle savedInstanceState имеет значение NULL.
  2. При изменении конфигурации значение пути Android не равно NULL в параметре savedInstanceState.
  3. После изменения конфигурации и возврата onCreate, Android вызывает onRestoreInstateState.
  4. По умолчанию все представления, имеющие id, пытаются восстановить свое состояние, EditText также восстанавливает свое состояние (на самом деле, TextView, который восстанавливает большую часть его).
  5. В некотором месте во время восстановления состояния (но после завершения метода onCreate) ваш EditText элемент управления вызывает setText для себя, чтобы восстановить текст, который имелся непосредственно перед изменением конфигурации.
  6. Ваш новый TextWatcher, который вы добавили в методе onCreate, получает уведомление об этом изменении.

Просто чтобы прояснить это, ваш старый TextWatcher, который вы добавили при первом вызове onCreate, не сохраняется!Это новый TextWatcher, который был добавлен при последнем вызове onCreate, который получает уведомление об изменении текста.

Вы можете проверить TextView.onRestoreInstanceState .

1 голос
/ 17 мая 2011

Когда вы поворачиваете устройство, метод действия onCreate вызывается снова. Если вы хотите запретить вызов onCreate при повороте устройства, выполните следующий код в манифесте

android:configChanges="orientation|keyboardHidden"

и в вашей активности

public void onConfigurationChanged(Configuration newConfig)
{       
    super.onConfigurationChanged(newConfig);    

    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
    {

    }      
    else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)
    {

    }  
}
...