Android - переключение между альбомным и портретным режимами приводит к потере значений Intent
-
06-09-2019 - |
Вопрос
Я использую Intents для переключения между действиями в моем приложении для Android.Я помещаю данные в Намерение для использования в следующем действии.Когда я переключаю телефон между альбомным и портретным режимами, значения, переданные из intent, теряются, и я получаю исключение NullPointerException.
Кто-нибудь, пожалуйста, может сказать мне, что может быть не так.
Есть много кода, чтобы опубликовать его полностью.Но если кому-то нужно взглянуть на определенные части кода, я могу опубликовать это здесь.
Редактировать
Я решил проблему с тем, что состояние не было сохранено.Но еще одна проблема, с которой я столкнулся, заключается в том, что ни одна из кнопок на экране не работает после изменения ориентации.При нажатии кнопки я получаю это предупреждение в LogCat
02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
Пожалуйста, помогите.
Решение
Когда вы меняете ориентацию, действие создается заново и onCreate вызывается, поэтому вам нужно использовать пакет для сохранения вашего текущего состояния и восстановления после изменения ориентации.Вы можете увидеть это в действии, если у вас есть просто приложение с TextView, и вы вводите текст и меняете ориентацию.Если вы объедините свое состояние для onCreate, вы сможете обуздать это.Вероятно, именно поэтому у вас появляется указатель NullPointer после изменения ориентации.Это чертовски раздражает, но с этим нам приходится жить.
Это ссылка на серию ознакомительных руководств и этот первый в частности, это должно помочь вам точно понять, что происходит и как успешно поддерживать ваше текущее состояние.
Обновить:Есть также пост на SO Перезапуск активности при вращении Android это касается почти одного и того же.
Редактировать для последующего вопроса:
Вы повторно подключили свои обработчики кликов после изменения ориентации?
Другие советы
Запишите это в свой манифест file..in какое действие вы хотите это--
android:configChanges="orientation|keyboardHidden"
Отредактированный: Используйте это для новых версий API--
android:configChanges="orientation|keyboardHidden|screenSize"
Определенно, это сработает..
Попробуй это:
@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);
...
}
Можно объявить атрибут android:configChanges со значением "orientation", это предотвратит перезапуск activity.Вместо этого действие остается запущенным и вызывается его метод onConfigurationChanged() .
Объявлять < android:configChanges="orientation|keyboardHidden"/>
в вашем манифесте.Это позволяет вам самостоятельно управлять изменением ориентации / видимости клавиатуры.Конечно, вам не нужно переопределять метод обратного вызова для управления им.
Привет, я тоже столкнулся с этой проблемой.то, что исправило это для меня, было:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's 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");
}
тогда вы можете быть уверены, что объекты не являются нулевыми.