Activité de gestion de la rotation dans Android
J'ai besoin d'appliquer des mises en page différentes pour les orientations portrait et paysage de mon activité. D'ailleurs, j'ai besoin d'afficher une alerte si l'orientation portrait.
J'ai spécifié android:configChanges="orientation|keyboardHidden"
dans AndroidManifest. J'ai également remplacer onConfigurationChanged méthode 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);
....
}
Lors de la rotation de paysage à portrait journal ressemble:
config changed
Portrait
Mais, tandis que l'évolution du mode portrait au mode paysage, il ressemble
config changed
Portrait
config changed
Landscape
Pourquoi onConfigurationChanged est appelé deux fois? Comment puis-je l'éviter?
OriginalL'auteur darja | 2010-09-25
Vous devez vous connecter pour publier un commentaire.
Voir ma réponse à une autre question: https://stackoverflow.com/a/3252547/338479
En bref, la manipulation des changements de configuration correctement est difficile à faire. Il est préférable de mettre en œuvre onRetainNonConfigurationInstance() qui est appelée juste avant que votre demande est sur le point d'être arrêté et redémarré en raison d'un changement de configuration. Utilisez cette méthode pour enregistrer ce que vous voulez ("il" est un bon choix) et de laisser le système de démontage de votre application.
Lorsque votre application obtient redémarré avec la nouvelle configuration, l'utilisation getLastNonConfigurationInstance() pour récupérer l'état que vous venez d'enregistrer, et de l'utiliser pour poursuivre votre application sans que le marinage sur avec des fagots et partagé préférences.
OriginalL'auteur Edward Falk
Vous pouvez simplement enregistrer l'orientation précédente et vérifier si elle a vraiment changé.
Si vous définissez dans
AndroidManifest.xml
android:configChanges
àkeyboardHidden|orientation
pour votre activité,onCreate
etc... ne sera pas appelé. Qui fait de la mise en œuvre nettement plus facile à mettre en œuvre. Mais bien sûr, mise en page va changer de portrait à paysage.OriginalL'auteur Irek Wisniowski
Est-il une raison particulière pour laquelle vous avez choisi de rotation de la poignée de cette manière? Alors qu'il est plus rapide puisque l'activité à ne pas avoir redémarré sur un changement d'orientation, il n'est généralement pas recommandé, si je me souviens bien. Un autre moyen de gérer les changements d'orientation de l'est au lieu de l'annulation de la
onConfigurationChanged()
, remplaçantonCreate()
,onStart()
ouonResume()
tels quepuis en spécifiant deux modèles - l'un pour le portrait, un paysage. La version portrait de la mise en page restera au
res/layout/whatever.xml
, et la version paysage de vivre enres/layout-land/whatever.xml
. Le AndroidGuys avait écrit un tas de bons articles sur ce sujet, voir http://androidguys.com/?s=rotational+forces&x=9&y=9OriginalL'auteur Chris Fei
Je suis sûr que vous pouvez utiliser onCreate plutôt que onStart. La seule différence semble être que le démarrage sera appelée lorsque l'application est au premier plan. Ce ne serait pas un cas où vous souhaiteriez apporter à l'utilisateur d'attendre pour vous pour re-initialiser l'INTERFACE utilisateur. Sinon, il suffit de changer votre setContentView appel en se basant sur que si la condition.
Pourquoi est-il mieux alors onConfigurationChanged?
Je crois que vous finirez par la construction de votre INTERFACE utilisateur deux fois dans ce cas. Les deux onConfigurationChange et onCreate sera appelée lorsque l'écran pivote. Vous avez déjà à la configuration de l'INTERFACE utilisateur dans onCreate pour tous les autres, créent des situations.
J'ai remarqué que si onConfigurationChanged est manipulé, l'activité n'est pas de recréer, onDestroy et onCreate ne sont pas appelés
OriginalL'auteur JOTN
Android démarre une nouvelle instance de votre activité lors du changement d'orientation à l'aide de onCreate est la méthode idéale. Vous devez sauvegarder/restaurer votre activité de données, évidemment, afin de reprendre là où vous l'avez laissé, mais vous devriez faire cela de toute façon, depuis n'importe quel nombre d'événements peuvent unfocus/tuer votre application.
OriginalL'auteur methodin