Je me demandais pourquoi ne pas l'utiliser android:configChanges="keyboardHidden|orientation"
dans chaque (presque;)) activité?
Des biens:
- pas besoin de s'inquiéter de la rotation de votre activité
- c'est plus rapide
Pas si cool:
- besoin de changer vos mises en page si elles dépendent de la taille de l'écran (par exemple, mises en page avec deux colonnes ou plus)
Mauvais:
- pas de moyen flexible d'avoir différentes mises en page sur différentes orientations
- pas si bon lors de l'utilisation de fragments
Mais si nous n'utilisons pas de mises en page différentes, pourquoi pas?
android
android-layout
Mikooos
la source
la source
Réponses:
Contexte rapide
Par défaut, lorsque certains changements de configuration clés se produisent sur Android (un exemple courant est un changement d'orientation), Android redémarre complètement l'activité en cours pour l'aider à s'adapter à ces changements.
Lorsque vous définissez
android:configChanges="keyboardHidden|orientation"
dans votre AndroidManifest, vous dites à Android: "Veuillez ne pas réinitialiser par défaut lorsque le clavier est retiré ou que le téléphone est tourné; je veux gérer cela moi-même. Oui, je sais ce que je fais "Est-ce une bonne chose? Nous verrons bientôt ...
Pas de soucis?
L'un des avantages avec lesquels vous commencez est qu'il y a:
Dans de nombreux cas, les gens croient à tort que lorsqu'ils ont une erreur générée par un changement d'orientation ("rotation"), ils peuvent simplement la corriger en insérant
android:configChanges="keyboardHidden|orientation"
.Cependant, android: configChanges = "keyboardHidden | orientation" n'est rien de plus qu'un pansement. En vérité, il existe de nombreuses façons de déclencher un changement de configuration. Par exemple, si l'utilisateur sélectionne une nouvelle langue (c'est-à-dire que les paramètres régionaux ont changé), votre activité sera redémarrée de la même manière que 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, comme le souligne hackbod dans les commentaires, votre activité sera également redémarrée lorsque votre application sera en arrière-plan et Android décidera de libérer de la mémoire en la tuant. Lorsque l'utilisateur revient sur votre application, Android tente de redémarrer l'activité de la même manière qu'il le fait s'il y avait une autre modification de configuration. Si vous ne pouvez pas gérer cela, l'utilisateur ne sera pas content ...
En d'autres termes, l'utilisation
android:configChanges="keyboardHidden|orientation"
n'est pas une solution à vos «soucis». La bonne façon est de coder vos activités afin qu'elles soient satisfaites de tout redémarrage qu'Android leur lance. C'est une bonne pratique qui vous aidera sur la route, alors habituez-vous-y.Alors, quand dois-je l'utiliser?
Comme vous l'avez mentionné, il y a un avantage distinct. Le remplacement du changement de configuration par défaut pour une rotation en le manipulant vous-même accélérera les choses. Cependant, cette vitesse a un prix de commodité.
Pour faire simple, si vous utilisez la même mise en page pour le portrait et le paysage, vous êtes en bonne forme en effectuant l'écrasement. Au lieu d'un rechargement complet de l'activité, les vues se déplaceront simplement pour remplir l'espace restant.
Cependant , si pour une raison quelconque vous utilisez une mise en page différente lorsque l'appareil est en mode paysage, le fait qu'Android recharge votre activité est bon car il chargera alors la mise en page correcte. [Si vous utilisez le remplacement sur une telle activité et que vous souhaitez effectuer une reconfiguration magique lors de l'exécution ... eh bien, bonne chance, c'est loin d'être simple]
Résumé rapide
Bien sûr, si cela vous
android:configChanges="keyboardHidden|orientation"
convient, utilisez-le. Mais S'IL VOUS PLAÎT, assurez-vous de tester ce qui se passe lorsque quelque chose change, car un changement d'orientation n'est pas le seul moyen de déclencher un redémarrage complet de l'activité.la source
Please don't do the default reset when the keyboard is pulled out
Je n'ai jamais vu de redémarrage d'activité pour le retrait du clavier !De mon point de vue: si la mise en page est la même en mode paysage et portrait, vous pouvez également désactiver l'un des deux dans votre application.
La raison pour laquelle je déclare cela est que, en tant qu'utilisateur, je m'attends à ce que l'application me fournisse un avantage lorsque je change d'orientation. Si la façon dont je tiens mon téléphone n'a pas d'importance, je n'ai pas besoin de choix.
Prenez par exemple une application où vous avez un ListView, et en cliquant sur un ListItem, vous voulez voir une vue détaillée de cet élément. Dans le paysage, vous le feriez en divisant l'écran en deux, en ayant la ListView à gauche et la vue détaillée à droite. Dans Portrait, vous auriez la liste sur un écran, puis changeriez l'écran en vue détaillée lorsqu'un élément de liste est sélectionné. Dans ce cas, le changement d'orientation a du sens ainsi que différentes dispositions.
la source
Je ne vois pas pourquoi .... les redémarrages occasionnels sont ok à mon avis ... configChanges gère la plupart des cas pour moi ... enfin peut-être que dans certains types d'applications, cela peut être un problème mais cela dépend vraiment du type d'application et de la façon dont vous restaurez état lorsque l'application redémarre ... Quand l'un de mes applications redémarre, l'utilisateur est connecté et la dernière activité s'ouvre par mon code et l'utilisateur perd quelques étapes pour revenir là où il était mais ce n'est pas grave. Dans d'autres, un état est toujours persistant et un état est toujours restauré au redémarrage. Lorsque l'activité a redémarré, il fallait que l'application n'ait pas été utilisée ou quelque chose ... donc pas de problème ... Dans le jeu par exemple, cela peut être un problème peut-être ou dans un autre type d'application que je ne sais pas ...
Je dis que lorsque vous le faites de cette façon, les applications fonctionnent très bien dans des circonstances normales. Et le code est beaucoup plus lisible sans une tonne de logique nécessaire pour enregistrer et restaurer où vous pouvez simplement créer de nouveaux bogues et le maintenir tout le temps ... Assurez-vous que si Android tombe hors de l'alimentation et tue votre fenêtre d'application, il perd le contexte et recommence, mais cela se produit juste dans des situations spéciales et sur les appareils plus récents, je pense que c'est de plus en plus rare ...
Alors tuez-moi, mais j'utilise cela avec succès dans toutes les applications ... android: configChanges = "locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize" Mais je comprends que pour certains types particuliers d'applications, ce n'est peut-être pas le cas bon moyen, mais la plupart des applications peuvent vivre avec cela juste OK.
la source
Ouais, je pense que faire une pause le rendra plus rapide que de libérer le lecteur. Encore une pause.
J'ai maintenant trouvé une solution qui ne mettra pas la chanson en pause.
Indiquez dans le manifeste que vous allez gérer le changement de configuration pour l'orientation de l'écran, puis utilisez la méthode onConfigurationChanged pour charger le fichier de disposition. En faisant cela dans logCat, je peux voir que onPause, onCreate et onResume ne sont pas appelés, et donc la chanson n'est pas mise en pause.
mettez à jour le manifeste pour gérer l'orientation.
ajouter ce code
la source