194 votes

Pourquoi ne pas utiliser toujours Android: configChanges = "keyboardHidden | orientation"?

Je me demandais pourquoi ne pas utiliser android:configChanges="keyboardHidden|orientation" de tous (presque tous ;)) activité?

Marchandises:

  • pas besoin de s'inquiéter à propos de votre activité été tourné
  • c'est plus rapide

N'est pas très joli:

  • besoin de changer votre dispositions si elles sont en fonction de la taille de l'écran (par exemple, la mise en page deux colonnes)

Mauvais:

  • pas de manière flexible pour différentes mises en page sur différents orientation
  • pas si bon quand à l'aide de fragments

Mais si nous n'utilisons pas de dispositions différentes, pourquoi pas?

352voto

yydl Points 6552

Rapide De Fond

Par défaut, lors de certains changements de configuration arriver sur Android (un exemple courant est celui d'un changement d'orientation), Android entièrement redémarrage de l'Activité en cours pour les aider à s'adapter à de tels changements.

Lorsque vous définissez android:configChanges="keyboardHidden|orientation" dans votre AndroidManifest, en vous disant Android: "Merci de ne pas faire la réinitialisation aux valeurs par défaut lorsque le clavier est sorti, ou le téléphone est tournée; je veux gérer moi-même. Oui, je sais ce que je fais"

Est-ce une bonne chose? Nous allons bientôt voir...

Pas de soucis?

L'un des avantages de commencer avec est qu'il y a:

pas besoin de s'inquiéter à propos de votre activité été tourné

Dans de nombreux cas, les gens croient à tort qu'ils ont une erreur qui est généré par un changement d'orientation ("rotation"), ils peuvent tout simplement le corriger en mettant en android:configChanges="keyboardHidden|orientation".

Cependant, android:configChanges="keyboardHidden|orientation" n'est rien de plus qu'un bandaid. En vérité, il existe de nombreuses façons pour un changement de configuration peut être déclenchée. Par exemple, si l'utilisateur sélectionne une nouvelle langue (c'est à dire les paramètres régionaux a changé), votre activité va être redémarré dans la même manière qu'il le fait par un changement d'orientation. Si vous le souhaitez, vous pouvez afficher une liste de tous les différents types de modifications de configuration.

Edit: Plus important encore, même si, comme hackbod points dans les commentaires, votre activité sera également redémarré lorsque votre application est en arrière-plan et Android décide de libérer de la mémoire en le tuant. Lorsque l'utilisateur revient à votre application, Android va tenter de relancer l'activité de la même manière qu'il le fait s'il y avait un autre changement de configuration. Si vous ne peut pas gérer - l'utilisateur ne sera pas heureux...

En d'autres termes, en utilisant des android:configChanges="keyboardHidden|orientation" n'est pas une solution pour vos "soucis." Le droit chemin est le code de vos activités de sorte qu'ils sont heureux avec un redémarrage Android jette à eux. C'est une bonne pratique qui va vous aider à vous en bas de la route, afin de s'habituer à elle.

Donc quand dois-je l'utiliser?

Comme vous l'avez mentionné il y a un avantage distinct. Écraser la configuration par défaut de changer pour une rotation de la manipulation, il vous permettra d'accélérer les choses. Toutefois, cette vitesse ne viennent avec un prix de convenance.

Pour le dire simplement, si vous l'utilisez pour la mise en page à la fois portrait et paysage, vous êtes en bonne forme par la pratique de la réécriture. Au lieu d'une véritable rechargement de l'activité, le point de vue va simplement déplacer pour remplir l'espace restant.

Toutefois, si pour quelque raison vous utilisez une mise en page différente lorsque l'appareil est en mode paysage, le fait que Android recharge votre Activité est bonne parce qu'elle se charge alors de la bonne mise en page. [Si vous utilisez le remplacer dans une telle Activité, et voulez faire un peu magique re-mise en page lors de l'exécution... et bien, bonne chance - c'est loin d'être simple]

Résumé

Par tous les moyens, si android:configChanges="keyboardHidden|orientation" est bon pour vous, alors l'utiliser. Mais VEUILLEZ assurez-vous de tester ce qui se passe quand quelque chose change, en raison d'un changement d'orientation n'est pas la seule façon d'une pleine Acitivité redémarrage peut être déclenchée.

3voto

kaspermoerch Points 7580

De mon point de vue: Si la disposition est la même dans les deux mode paysage et portrait - vous pouvez aussi désactiver l'un des deux dans votre application.

La raison pour laquelle je dis cela est que j'ai en tant qu'utilisateur s'attendre à l'application de me fournir un certain avantage, quand j'ai changer d'orientation. Si elle n'a pas d'importance comment je tiens mon téléphone, puis je n'ai pas le choix.

Prenez, par exemple, une application où vous avez une ListView, et en cliquant sur une ListItem vous souhaitez afficher une vue détaillée de cet article. Des paysages à vous od en divisant l'écran en deux, d'avoir la liste sur la gauche et la vue de détail sur la droite. En mode Portrait, vous avez la liste dans un seul écran, puis de changer l'écran pour l'affichage détaillé lors de la ListItem est sélectionné. Dans ce cas, l'orientation du changement de sens ainsi que les différentes mises en page.

-3voto

Raul Points 1

Oui, je pense que la pause sera de le rendre plus rapide que de libérer le joueur. Encore la pause.

Ont maintenant trouvé une solution à ne pas mettre en pause la chanson.

De l'état dans le manifeste que vous allez gérer la config changement de l'orientation de l'écran, puis utilisez la onConfigurationChanged méthode pour charger le fichier de mise en page. En faisant cela, dans le logCat je peux voir onPause, onCreate & onResume ne sont pas appelés, et, par conséquent, la chanson n'est pas en pause.

  1. mise à jour le manifeste pour gérer l'orientation. android:configChanges="orientation|screenSize"
  2. ajoutez ce code

    @Override
    public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-généré méthode stub
    super.onConfigurationChanged(newConfig);
    setContentView(R. layout.activity_main); }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X