5

Je dois gérer les changements d'orientation dans mon application Android. À cette fin, j'ai décidé d'utiliser OrientationEventListener classe de commodité. Mais sa méthode de rappel a un comportement quelque peu étrange.Problèmes lors de la manipulation des changements d'orientation

Mon application démarre en mode portrait, puis passe finalement à la lanscape un. J'ai un code personnalisé s'exécutant dans la méthode de rappel onOrientationChanged qui fournit une certaine logique de gestion de l'interface utilisateur supplémentaire - il a quelques appels à findViewById. Ce qui est étrange est que lors du basculement du mode paysage au mode portrait onOrientationChanged rappel est appelé deux fois, et ce qui est encore pire - le deuxième appel est affaire à mauvaiseContext - méthode findViewById commence à revenir null. Ces appels sont faits dès le MainThread

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    listener = new OrientationListener(); 
} 

    @Override 
protected void onResume() {  
    super.onResume(); 
    // enabling listening 
    listener.enable(); 
} 
    @Override 
protected void onPause() { 
    super.onPause(); 
    // disabling listening 
    listener.disable(); 
} 

J'ai reproduit le même comportement avec une Activity factice sans aucune logique, sauf pour celui qui traite l'orientation LA MANUTENTION. je lance commutateur d'orientation de l'émulateur Android 2.2 en appuyant sur Ctrl + F11 Quoi de mal?

Upd: Classe interne qui implémente OrientationEventListener

private class OrientationListener extends OrientationEventListener { 
    public OrientationL() { 
     super(getBaseContext()); 
    } 

    @Override 
    public void onOrientationChanged(int orientation) { 

     toString(); 

    } 
} 

}

+1

s'il vous plaît envoyer votre code onOrientationChanged trop –

+1

Avez-vous essayé lors des tests sur un téléphone réel? J'ai eu quelques problèmes avec les changements d'orientation qui ne se sont produits que lors des tests sur un émulateur. Cela avait quelque chose à voir avec l'émulateur qui fausse le changement d'orientation de l'écran - j'ai aussi eu un problème avec cela en recréant l'application deux fois. –

+0

Unfortunatelly Je n'ai pas accès au téléphone réel pour l'instant – nixau

Répondre

5

Il s'agit d'un bogue documenté dans l'émulateur SEULEMENT. Un périphérique réel ne présentera pas ce comportement d'événements de cycle de vie double. J'ai eu le même problème il y a un moment et il disparaît sur un vrai appareil.

je suggère d'ignorer le problème si vous pouvez en ne testant que les changements d'orientation dans une direction jusqu'à ce que vous obtenez vos mains sur un téléphone physique. Sinon, vous pourriez être en mesure d'ignorer le deuxième ensemble d'appels de cycle de vie en gardant un booléen statique indiquant que vous avez déjà passé le premier ensemble.

Voir this issue report pour plus d'informations.

+0

eu quelques problèmes sur motorola xoom, onCreate est appelé deux fois de suite trop http://stackoverflow.com/posts/3922257 – RzR

3

Avez-vous essayé d'utiliser onConfigurationChanged?

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)… 
+0

J'ai le même problème avec la méthode 'findViewById'. C'est bizarre mais il semble que la disposition déclarative spécifiée dans le fichier '.xml' n'a pas encore été rendue. – nixau

+0

de toute façon onConfigurationChanged semble être une meilleure solution par rapport à l'abonnement de rappel OrientationEventListener – nixau

1

Ajouter android: configChanges = "orientation" dans le fichier manifeste dans la balise d'activité comme

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">

Questions connexes