5

Je dois appliquer différentes dispositions pour les orientations portrait et paysage de mon activité. En outre, je dois montrer l'alerte si l'orientation est portrait.Activité de manipulation tournant dans Android

J'ai spécifié android:configChanges="orientation|keyboardHidden" dans AndroidManifest. Je surchargeons aussi la méthode onConfigurationChanged comme ceci:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

Pendant la rotation du paysage au journal portrait ressemble:

config changed 
Portrait 

Mais tout en changeant du mode portrait au paysage, il ressemble à

config changed 
Portrait 
config changed 
Landscape 

Pourquoi onConfigurationChanged est appelé deux fois? Comment puis-je l'éviter?

Répondre

3

Voir ma réponse à une autre question ici: https://stackoverflow.com/a/3252547/338479

En bref, le traitement des changements de configuration correctement est difficile à faire. Il est préférable d'implémenter onRetainNonConfigurationInstance() qui est appelée juste avant que votre application soit sur le point d'être arrêtée et redémarrée en raison d'un changement de configuration. Utilisez cette méthode pour enregistrer tout ce que vous voulez ('ceci' est un bon choix), puis laissez le système démolir votre application. Lorsque votre application est redémarrée avec la nouvelle configuration, utilisez getLastNonConfigurationInstance() pour récupérer l'état que vous venez d'enregistrer et utilisez-la pour continuer votre application sans avoir à vous soucier des bundles et des préférences partagées.

0

Y a-t-il une raison particulière pour laquelle vous avez choisi de gérer la rotation de cette manière? Bien qu'il soit plus rapide puisque l'activité ne redémarre pas lors d'un changement d'orientation, elle n'est généralement pas recommandée, si je me souviens bien. Une autre façon de gérer les changements d'orientation est au lieu de passer outre , remplaçant onCreate(), onStart() ou onResume() tels que

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

et puis en spécifiant deux dispositions - un pour le portrait, l'un pour le paysage. La version portrait de la mise en page resterait à res/layout/whatever.xml, et la version paysage serait en res/layout-land/whatever.xml. L'AndroidGuys avait écrit un tas de bons articles sur ce sujet, voir http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

Pourquoi onConfigurationChanged() est mauvaise voie? Pourriez-vous me donner un lien avec des explications? Si je vais utiliser onCreate() ou quelque chose comme que l'activité sera recréée et ses données seront perdues. – darja

0

Je suis sûr que vous voudriez utiliser onCreate plutôt que sur OnStart. La seule différence semble être que onStart sera appelé lorsque l'application arrive au premier plan. Ce ne serait pas un cas où vous voudriez que l'utilisateur attende que vous ré-initialisiez l'interface utilisateur. Sinon, modifiez simplement votre appel à setContentView en fonction de cette condition if.

+0

Je suis d'accord avec vous, la méthode onCreate est invoquée lorsque l'orientation de l'appareil change –

+0

Pourquoi est-il mieux alors onConfigurationChanged? – darja

+0

Je crois que vous finirez par créer votre interface utilisateur deux fois dans ce cas. Les deux onConfigurationChange et onCreate seront appelés lorsque l'écran tourne. Vous devez déjà configurer l'interface utilisateur dans onCreate pour toutes les autres situations de création. – JOTN

0

Android démarre une nouvelle instance de votre activité lorsque vous changez d'orientation. L'utilisation de onCreate est donc la méthode idéale. Vous devrez sauvegarder/restaurer les données de votre activité de façon évidente afin de reprendre là où vous vous étiez arrêté - mais vous devriez le faire de toute façon, car un nombre quelconque d'événements peuvent entraîner la perte de votre application.

+0

Pourquoi les downvotes? Il a raison. –

1

Vous pouvez simplement enregistrer l'orientation précédente et vérifier si elle a vraiment changé.

Si vous définissez dans AndroidManifest.xmlandroid:configChanges-keyboardHidden|orientation pour votre activité, onCreate etc ... ne seront pas appelés. Cela rend la mise en œuvre beaucoup plus facile à mettre en œuvre. Mais bien sûr, la mise en page passera du portrait au paysage.