web-dev-qa-db-fra.com

Android - le passage du mode paysage au mode portrait fait perdre de la valeur à l'intention

J'utilise Intents pour passer d'une activité à une autre dans mon application Android. Je mets des données dans l'intention pour une utilisation dans la prochaine activité. Lorsque je commute le téléphone entre les modes paysage et portrait, les valeurs transmises de l'intention sont perdues et j'obtiens une exception NullPointerException.

Quelqu'un peut-il me dire ce qui pourrait être faux.

Il y a beaucoup de code pour l'afficher entièrement. Mais si quelqu'un a besoin d'examiner des parties spécifiques du code, je peux le poster ici.

Modifier
J'ai résolu le problème de la non-sauvegarde de l'état. Mais un autre problème que j'ai rencontré est qu'aucun des boutons sur l'écran ne fonctionne après que l'orientation ait été modifiée. En appuyant sur le bouton, je reçois cet avertissement dans LogCat

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

S'il vous plaît aider.

19
lostInTransit

Lorsque vous changez d'orientation, l'activité est recréée et onCreate est rappelé. Vous devez donc utiliser l'ensemble pour enregistrer votre état actuel et le restaurer après un changement d'orientation. Vous pouvez voir cela en action si vous ne disposez que d'une application avec un TextView et que vous saisissez du texte et modifiez l'orientation. Si vous regroupez votre état pour onCreate, vous pouvez le limiter. C'est probablement aussi la raison pour laquelle vous avez un NullPointer après le changement d'orientation. C'est énervant, mais c'est quelque chose avec lequel nous devons vivre.

Ce lien sur une série de tutoriels d’orientation et ce premier devrait en particulier vous aider à comprendre exactement ce qui se passe et comment maintenir avec succès votre état actuel.

Mise à jour: il y a aussi une publication sur SO Redémarrage de l'activité sur la rotation Android qui traite presque de la même chose.

Modifier pour la question suivante:

Avez-vous réaffecté vos gestionnaires de clics après le changement d'orientation?

24
Quintin Robinson

Ecrivez ceci dans votre fichier manifeste ... dans quelle activité vous voulez ceci--

 Android:configChanges="orientation|keyboardHidden"

Édité: Utilisez celui-ci pour les nouvelles versions d'API--

Android:configChanges="orientation|keyboardHidden|screenSize"

Certainement ça va marcher .. 

9
Hulk

Essaye ça:

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

Il est possible de déclarer un attribut Android: configChanges avec la valeur "orientation", cela empêchera l'activité de redémarrer. Au lieu de cela, l'activité reste en cours d'exécution et sa méthode onConfigurationChanged () est appelée.

3
Nadav Daniel

Déclarez < Android:configChanges="orientation|keyboardHidden"/> dans votre manifeste. Cela vous permet de gérer vous-même le changement de visibilité d'orientation/clavier. Bien sûr, vous n'avez pas besoin de remplacer la méthode de rappel pour la gérer.

1
Nguyen Minh Binh

Salut j'ai aussi rencontré ce problème. Pour moi, ce qui a été réglé:

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

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

alors vous pouvez être sûr que les objets ne sont pas nuls.

0
Noyloy