Нежелательные вызовы onItemSelected после восстановления состояния приложения

Здравствуйте,
У меня есть несколько объектов Spinner, которые при выборе изменяют содержимое EditText и кнопки. Все работает нормально, пока я не включу и не выключу экран.
Я сделал ориентацию приложения только альбомной, и поэтому при включении и выключении экрана активность уничтожается.

Проблема, возникающая здесь, заключается в том, что я теряю всю информацию о состоянии объектов Spinner, EditText и Button.
Поэтому я попытался решить эту проблему с помощью методов onSaveInstanceState и onRestoreInstanceState, установив обратно состояние Spinner, Button и EditText именно в таком порядке.
Проблема в том, что по какой-то причине метод onItemSelected вызывается после того, как я восстановил состояние Button и EditText, и, таким образом, для них установлены значения по умолчанию.
Я попытался отключить метод onItemSelected. слушатели onItemSelected временно, но как только я снова их включаю, вызывается метод onItemSelected и сбрасывает состояние Button и EditText.

Примечание. Я хочу восстановить состояние только после того, как приложение было уничтожено системой, а не пользователем.


person user1219263    schedule 20.11.2012    source источник


Ответы (1)


Вы можете создать глобальную логическую переменную и при восстановлении установить для нее значение true. В onItemSelected вы можете проверить эту переменную, и если она верна, вы не будете изменять содержимое кнопок и editText, просто установите для этой переменной значение false. В onRestoreInstaceState:

wasRestored = true;

В onItemSelected:

if(wasRestored){
   wasRestored=false;
   return;
} else {//change editText and Button content}
person jumper0k    schedule 20.11.2012
comment
Я попробовал это, установив значение true в начале метода onRestoreInstanceState и вернув значение false в конце. Однако это не работает, однако, когда я не устанавливаю для него значение false, оно работает, но тогда мой Spinner, очевидно, больше не работает. Итак, с моей точки зрения, кажется, что метод onItemSelected вызывается после метода onRestoreInstanceState, хотя я понятия не имею, где и почему. - person user1219263; 20.11.2012
comment
вы должны попытаться установить значение false в onItemSelected, а не в onRestoreInstanceState. if(variable){variable=false;return;} - примерно так. - person jumper0k; 20.11.2012
comment
Хорошо, я исправил это, но проблема все еще есть. Поэтому я попытался выяснить, что происходит с некоторыми журналами. Следующие методы, которые я реализовал, вызываются при включении экрана без вашего предложения: onCreate - init (инициализируются Spinner, Button и EditText) - onRestoreInstanceState - onItemSelected - onItemSelected. При добавлении глобального логического значения первый вызов onItemSelected исчезает, но все равно где-то вызывается onItemSelected. - person user1219263; 20.11.2012
comment
Ну пробовали ли вы при восстановлении ставить спиннер в положение, чем было раньше, тогда может ваши данные в edittext и кнопку перезагрузятся, но будет то же самое? - person jumper0k; 20.11.2012
comment
Извините, но я не уверен, что вы имеете в виду, мне действительно удалось это исправить, добавив второе глобальное логическое значение для обхода второго вызова onItemSelected. Конечно, это не идеально, но пока работает. Я все еще пытаюсь понять, почему onItemSelected вызывается (дважды) после onRestoreInstanceState. - person user1219263; 20.11.2012