Android - переключение между альбомным и портретным режимом заставляет Intent терять значения - PullRequest
20 голосов
/ 25 февраля 2009

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

Может кто-нибудь сказать мне, что может быть не так.

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

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

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

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

Ответы [ 6 ]

25 голосов
/ 25 февраля 2009

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

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

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

Изменить для уточнения вопроса:

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

9 голосов
/ 10 мая 2012

Запишите это в свой файл манифеста .. в какой деятельности вы хотите это -

 android:configChanges="orientation|keyboardHidden"

Отредактировано: Используйте это для новых версий API -

android:configChanges="orientation|keyboardHidden|screenSize"

Определенно, это будет работать ..

5 голосов
/ 13 июля 2009

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

@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);
   ...
}
3 голосов
/ 20 марта 2011

Можно объявить атрибут android: configChanges со значением «direction», это предотвратит перезапуск активности. Вместо этого действие продолжает выполняться, и вызывается его метод onConfigurationChanged ().

1 голос
/ 22 октября 2012

Объявите < android:configChanges="orientation|keyboardHidden"/> в своем манифесте. Это позволяет самостоятельно управлять изменением видимости ориентации / клавиатуры. Конечно, вам не нужно переопределять метод обратного вызова для управления им.

0 голосов
/ 29 октября 2015

Привет, я тоже столкнулся с этой проблемой. что исправило это для меня было:

@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");
}

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

...