2012-02-15 4 views
0

Я разрабатываю приложение для Android и не понимаю кнопку «Назад».Кнопка «Назад» занимает 3 попытки

Существует активность (скажем, A1), с которой нажатием кнопки пользователь переходит к другому действию (скажем, A2). Как только пользователь закончил работу с A2, он нажимает кнопку «Назад», чтобы вернуться к предыдущему действию A1. Все документы говорят, что A1 будет onResume() в этот момент.

И это действительно так. Однако, если я нахожусь в A2 и меняю ориентацию экрана (от пейзажа к портрету или наоборот), то происходит что-то совсем другое. А2-активность снова появляется, в зависимости от ориентации экрана. Когда я нажимаю BACK сейчас, активность A2 снова появляется (без изменения ориентации экрана). При повторном нажатии BACK снова активируется операция A2. ТРЕТЬЕ нажатие на назад возвращает вас к Activity A1.

Что я делаю неправильно здесь, чего мне не хватает? Thanks

Peter

ответ

0

Мой вопрос не был сформулирован полностью правильно. Я немного упростил дело. Я использую Spinner, а не Button, чтобы перейти к следующему действию.

Spinner (и Галерея) имеют грубую ошибку, не упомянутую в документах - обработчик события OnItemSelectedListener вызывается, когда пользователь физически щелкает элемент управления прядильщика, а также когда первый раз выровняется с помощью кода рамки. Поэтому ваш код обработки spinner должен определять, было ли событие инициировано выбором пользователя или выложенным счетчиком. Самый простой способ сделать это - сделать первый элемент в Spinner всегда «еще не выбранным» и игнорировать все события этого выбора. См. Android Spinner selection и аналогичные должности.

В моем случае изменение ориентации привело к тому, что счетчик был снова выложен, и, таким образом, я получил от него два события, первое из которых - событие компоновки, второе - из ранее выбранной записи. И , что вызвало запуск второстепенного запуска, и , что означало, что для «возврата» к первой операции потребовалось 3 нажатия кнопки «Назад». На самом деле он возвращался к первой прессе, затем прядильщик уволил событие макета, и регулярное мероприятие дважды меня втолкнуло. Это не было видно на экране, но было видно с помощью сообщений журнала.

Когда вы меняете ориентацию, текущая активность уничтожается и создается новое действие. Когда вы меняете ориентацию и нажимаете клавишу «Назад», предыдущее действие выставляется из верхней части приостановленного стека, уничтожается и создается новая версия этого действия, созданная/запущенная.

При изменении ориентации экрана активность в старой ориентации никогда не сохраняется. Он будет немедленно уничтожен, или если он будет ниже в стеке Paused, он будет уничтожен, когда он достигнет вершины.

-1

Вы не обрабатываете изменения конфигурации. Проверьте связь this, это может вам помочь.

Когда вы меняете ориентацию от портрета к пейзажу или от пейзажа к портрету, и если вы не обрабатываете изменения конфигурации, то активность воссоздается.

+0

так вы говорите, что стек приостановленных действий выглядит так? (Arggh, не может помещать новые строки в комментарии) TOP of stack - Activity A2 in landscape - Activity A2 в портретном END. Это кажется очень противоречивым. –

+0

Ваш задний стек не будет знать, является ли ваша деятельность портретной или альбомной.Итак, это похоже на TOP of stack -> Activity A2 -> Еще одно действие A2 -> END стека. – Enigma

+0

Это казалось противоречивым, потому что предложение, внесенное Enigma, было неправильным. Это была не вина Энигмы - я не представил достаточной информации в том, как я сформулировал вопрос. Но факт остается фактом: изменение конфигурации приводит к уничтожению старой активности, которая не сохраняется в стеке. –

Смежные вопросы