Android - переключение между ландшафтным и портретным режимами делает Intent теряет значения
Я использую Intents для переключения между действиями в приложении для Android. Я помещаю данные в намерение для использования в следующем действии. Когда я переключаю телефон между пейзажным и портретным режимами, значения, переданные из намерения, теряются, и я получаю исключение NullPointerException.
Может кто-нибудь, пожалуйста, скажите мне, что может быть неправильно.
Там много кода, чтобы опубликовать его полностью. Но если кому-то нужно взглянуть на определенные части кода, я могу опубликовать его здесь.
Edit
Я решил проблему сохранения состояния. Но еще одна проблема, с которой я столкнулся, заключается в том, что ни одна из кнопок на экране не работает после изменения ориентации. При нажатии кнопки, я получаю это предупреждение в LogCat
02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
Пожалуйста, помогите.
Ответы
Ответ 1
Когда вы переключаете ориентацию, активность воссоздается и вызывается функция onCreate, поэтому вам нужно использовать пакет для сохранения текущего состояния и восстановления после изменения ориентации. Вы можете увидеть это в действии, если у вас есть приложение с TextView, и вы вводите текст и меняете ориентацию. Если вы свяжете свое состояние с onCreate, вы можете обуздать это. Вероятно, это также связано с тем, что после изменения ориентации у вас есть NullPointer. Это раздражает, как и весь ад, но с чем мы должны жить.
Эта ссылка на серию учебников ориентации и это первая один из них, в частности, должен помочь вам точно понять, что происходит и как успешно поддерживать текущее состояние.
Обновление: есть также сообщение о SO Перезагрузка активности при ротации Android, которая имеет почти одно и то же.
Изменить для последующего вопроса:
Повторно подключили обработчики кликов после изменения ориентации?
Ответ 2
Запишите это в свой файл манифеста.. в какой активности вы хотите это сделать -
android:configChanges="orientation|keyboardHidden"
Отредактировано: Используйте это для новых версий API -
android:configChanges="orientation|keyboardHidden|screenSize"
Определенно это сработает.
Ответ 3
Попробуйте следующее:
@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);
...
}
Ответ 4
Можно объявить атрибут android: configChanges со значением "ориентация", это предотвратит перезапуск активности. Вместо этого активность остается запущенной и вызывается метод onConfigurationChanged().
Ответ 5
Объявите < android:configChanges="orientation|keyboardHidden"/>
в своем манифесте. Это позволяет вам самостоятельно изменять видимость ориентации/клавиатуры. Конечно, вам не нужно переопределять метод обратного вызова для управления им.
Ответ 6
Привет, я также столкнулся с этой проблемой.
для меня это было исправлено:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user current game state
savedInstanceState.putString("Username", mUsername);
savedInstanceState.putString("Password", mPassword);
savedInstanceState.putString("UserID", mUserID);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
а затем в onCreate():
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if(extras == null) {
mUsername = "?";
mPassword = "?";
mUserID = "?";
} else {
mUsername = extras.getString("Username");
mPassword = extras.getString("Password");
mUserID = extras.getString("UserID");
}
} else {
mUsername = (String) savedInstanceState.getSerializable("Username");
mPassword = (String) savedInstanceState.getSerializable("Password");
mUserID = (String) savedInstanceState.getSerializable("UserID");
}
то вы можете быть уверены, что объекты не являются нулевыми.