2009-02-25 7 views
19

Estoy usando Intents para alternar entre actividades en mi aplicación de Android. Estoy poniendo datos en la intención para usarlos en la próxima actividad. Cuando cambio el teléfono entre los modos horizontal y vertical, los valores pasados ​​del intento se pierden y obtengo una NullPointerException.Android: la conmutación entre paisaje y modo retrato hace que Intent pierda valores

¿Puede alguien decirme qué podría estar mal?

Hay un montón de código para publicarlo por completo. Pero si alguien necesita ver partes específicas del código, puedo publicarlo aquí.

Editar
He resuelto el problema de estado no se guarda. Pero otro problema al que me enfrenté es que ninguno de los botones en la pantalla funciona después de haber cambiado la orientación. Al presionar un botón, aparece esta advertencia en LogCat

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

Por favor ayuda.

Respuesta

23

Cuando cambia de orientación, la actividad se recrea y onCreate se recupera, por lo que debe usar el paquete para guardar su estado actual y restaurarlo después de un cambio de orientación. Puede ver esto en acción si solo tiene una aplicación con un TextView e ingresa texto y cambia de orientación. Si agrupa su estado en onCreate puede frenar esto. Probablemente también sea esta la razón por la que tiene un NullPointer después de que la orientación cambia. Es molesto como el infierno, pero es algo con lo que tenemos que vivir.

This enlace en una serie de tutoriales de orientación y this first one en particular, debería ayudarle a comprender exactamente qué está pasando y cómo mantener con éxito su estado actual.

Actualización: También hay una publicación en SO Activity restart on rotation Android que trata de casi lo mismo.

Editar para el seguimiento pregunta:

Quizás quiso volver a conectar sus manipuladores clic después del cambio de orientación?

+0

¿Por qué la última pregunta? ¿Es importante volver a unir oyentes? Por favor hagamelo saber. :) –

+0

Sí, porque si no los vuelve a colocar, seguirán unidos a los botones anteriores que ya no existen. –

+1

+1 ¡gracias! Me acabo de atascar con este error durante la última hora. ¡He llegado a detestar realmente el desarrollo de Android! Esto complica cosas triviales. –

5

Prueba esto:

@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

Es posible declarar un androide atributo: configChanges con el valor de "orientación", esto evitará la actividad de ser renovadas. En cambio, la actividad sigue ejecutándose y se llama a su método onConfigurationChanged().

+0

Agregar esto es a la etiqueta de actividad – sami

8

escribir esto en su file..in manifiesta la actividad que desea esto-

android:configChanges="orientation|keyboardHidden" 

Editado: utilizar éste para nuevas API versions--

android:configChanges="orientation|keyboardHidden|screenSize" 

Definitivamente lo hará trabajo ..

+0

Esto se trabajó en el emulador. Pero no funcionó en el dispositivo real. – enadun

+0

Esto también funcionará en el dispositivo real. Asegúrese de haber agregado esto en la actividad en la que ocurre el problema. – Hulk

+0

no funcionó !!!! –

1

Declara < android:configChanges="orientation|keyboardHidden"/> en tu manifiesto. Esto le permite administrar el cambio de visibilidad de Orientación/Teclado por su cuenta. Por supuesto, no es necesario anular el método de devolución de llamada para administrarlo.

0

Hola También he encontrado este problema. lo fija para mí era:

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

y luego en 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"); 
} 

entonces usted puede estar seguro de que los objetos no son nulos.

Cuestiones relacionadas