Подтвердить что ты не робот

Android - переключение между ландшафтным и портретным режимами делает Intent теряет значения

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

Может кто-нибудь, пожалуйста, скажите мне, что может быть неправильно.

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

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

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

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

4b9b3361

Ответ 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");
}

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