Android - переключение между режимами пейзажа и портретом делает Intent беспроигрышных значений

голоса
19

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

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

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

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

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

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

Задан 25/02/2009 в 06:10
источник пользователем
На других языках...                            


6 ответов

голоса
23

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

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

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

Редактировать для прослеживания вопроса:

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

Ответил 25/02/2009 d 06:23
источник пользователем

голоса
9

Запишите это в вашем манифеста file..in деятельность которого вы хотите this--

 android:configChanges="orientation|keyboardHidden"

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

android:configChanges="orientation|keyboardHidden|screenSize"

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

Ответил 10/05/2012 d 10:17
источник пользователем

голоса
5

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

@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);
   ...
}
Ответил 13/07/2009 d 10:33
источник пользователем

голоса
3

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

Ответил 20/03/2011 d 15:21
источник пользователем

голоса
1

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

Ответил 22/10/2012 d 07:03
источник пользователем

голоса
0

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

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

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

Ответил 29/10/2015 d 17:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more