Android - переключение между альбомным и портретным режимами приводит к потере значений Intent

Asked
Viewd59504

20

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

Подскажите, пожалуйста, в чем проблема?

Для его публикации нужно много кода. Но если кому-то нужно взглянуть на определенные части кода, я могу опубликовать это здесь.

Изменить
Решил проблему несохранения состояния. Но еще одна проблема, с которой я столкнулся, заключается в том, что ни одна из кнопок на экране не работает после изменения ориентации. При нажатии кнопки я получаю это предупреждение в LogCat

 02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
 

Пожалуйста, помогите.

6 ответов

25

При переключении ориентации действие воссоздается и вызывается onCreate, поэтому вам нужно использовать пакет для сохранения текущего состояния и восстановления после изменения ориентации. Вы можете увидеть это в действии, если у вас есть только приложение с TextView, и вы вводите текст и меняете ориентацию. Если вы объедините свое состояние для onCreate, вы можете обуздать это. Вероятно, поэтому у вас появляется NullPointer после изменения ориентации. Это чертовски раздражает, но нам приходится жить с этим.

Эта ссылка на серию руководств по ориентации и этот первый , в частности, должен помочь вам понять, что именно происходит и как успешно поддерживать текущее состояние.

Обновление: есть также сообщение на SO перезапуск активности при вращении Android , который касается почти того же.

Изменить следующий вопрос:

Прикрепили ли вы обработчики кликов заново после изменения ориентации?

  • Почему последний вопрос?Важно ли повторно подключать слушателей?Пожалуйста, дайте мне знать.:)

    Giorgio Vespucci30 марта 2011, 08:22
  • +1 спасибо!Я просто застрял с этой ошибкой на последний час.Я действительно возненавидел разработку под Android!Это усложняет тривиальные вещи.

    W.K.S25 января 2012, 18:47
  • Да, потому что, если вы не прикрепите их повторно, они все равно будут прикреплены к старым кнопкам, которых больше нет.

    Guillaume Brunerie13 июля 2011, 00:41
5

Попробуйте это:

 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(SOME_KEY, "blah blah blah");
}

@Override
public void onCreate(Bundle savedInstanceState) {
   ...
   somevalue = savedInstanceState.getString(SOME_KEY);
   ...
}