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

StackOverflow https://stackoverflow.com/questions/584779

Вопрос

Я использую 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");
}

тогда вы можете быть уверены, что объекты не являются нулевыми.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top