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

178

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?

Mikooos
la source
6
Vous devriez également expliquer ce que vous pensez que keyboardHidden | orientation fait
Blundell
Cela empêche d'utiliser la gestion native des modifications de configuration spécifiées et de permettre à l'application de les gérer, n'est-ce pas?
Mikooos
2
C'est pourquoi cette option est là, si vous savez ce que vous faites (pas de changements dans les ressources), utilisez-la.
Pointer Null
pourquoi est-ce plus rapide que d'utiliser ScreenSize?
batmaci

Réponses:

334

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:

pas besoin de s'inquiéter de la rotation de votre activité

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é.

yydl
la source
50
Il vaut la peine d'ajouter que ne pas gérer votre activité en cours de redémarrage signifie que vous avez de plus gros problèmes que de ne pas gérer les changements de configuration moins courants. Le redémarrage de l'activité utilisé ici est exactement le même mécanisme que la façon dont Android restaure votre activité à son état précédent lorsque votre application est tuée en arrière-plan. Donc, si vous ne le faites pas correctement, vos utilisateurs verront au hasard votre application ne pas revenir correctement lorsqu'ils y reviendront depuis l'arrière-plan, selon que le processus a été tué ou non. Donc un énorme avantage: cela garantit que votre application redémarre correctement.
hackbod
14
Depuis Android 3.x, ne manquez pas d'ajouter "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"]
Michael Biermann
1
J'ai remarqué que lorsque vous utilisez l'attribut configChanges, votre application ignore également la fonction de verrouillage d'orientation. Comment pouvez-vous résoudre cela? si vous connaissez la réponse, écrivez-la ici: stackoverflow.com/questions/24000361/...
développeur android
4
Please don't do the default reset when the keyboard is pulled outJe n'ai jamais vu de redémarrage d'activité pour le retrait du clavier !
Muhammad Babar
et bien les redémarrages occasionnels sont ok à mon avis ... configChanges gère la plupart des cas pour moi ... enfin peut-être que dans un autre type d'applications cela peut être un problème mais cela dépend vraiment ....
Renetik
2

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.

kaspermoerch
la source
4
Oui, nous avons choisi cela dans la version 1.0 de notre application, pour correspondre à notre version Apple. Il a été présenté UNIQUEMENT en portrait. Ce qui avait fière allure sur mon Droid X, nous correspondions exactement au comportement du clavier contextuel de la version IOS. Ensuite, le directeur financier a installé l'application sur son Droid, l'a tournée sur le côté et a fait glisser le clavier pour l'ouvrir. Oups. Le problème avec Android est qu'il s'agit d'une plate-forme ouverte et que vous ne pouvez vraiment pas prédire la configuration matérielle ou ce que l'utilisateur voudra en faire, vous devriez donc probablement prendre en charge les deux (toutes) orientations au cas où.
Tevo D
1
Ce qui a d'ailleurs remplacé notre paramètre de portrait uniquement, car c'était essentiellement dans le matériel que le paysage était alors l'orientation normale, et non alternative. Ce qui a vraiment gâché notre mise en page: (et était assez embarrassant, ayant un défaut majeur quelques secondes après avoir installé l'application
Tevo D
1
Pourquoi avez-vous essayé de le faire se comporter exactement comme iOS? :(
FunkTheMonk
7
@FunkTheMonk Malheureusement, nous vivons dans un monde où les hommes d'affaires prennent des décisions techniques. Même si vous vous y opposez, la moitié du temps, ils pensent qu'ils ont raison de toute façon. Et ils contrôlent votre chèque de paie.
StackOverflowed
2
L'utilisation d'une seule mise en page ne signifie pas que l'écran aura le même aspect lors de la rotation. Une mise en page XML bien structurée fera que les choses se déplacent automatiquement pour bien fonctionner avec des dimensions raisonnables, et les utilisateurs l'apprécieront.
Melinda Green
-1

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.

Renetik
la source
Salut quelqu'un peut-il connaître ce sujet s'il vous plaît jeter un oeil à mon fil: stackoverflow.com/questions/35941585/…? Besoin d'aide désespérément.
Luke Allison
Vous devez pleinement prendre en charge l'enregistrement / la reprise des activités ... le gérer pour la rotation n'est pas différent ... Vous dites que vous perdez quelques étapes ... si vous le faites correctement, vous ne perdez aucune étape et vous restaurez exactement là où l'utilisateur s'était arrêté ... même après le redémarrage de l'appareil.
HAMMeReD
martelé Je ne sais pas de quoi vous parlez mais 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 crois que c'est de plus en plus rare ...
Renetik
Ignorer le respect du contrat d'activité (état de sauvegarde / restauration) est une mauvaise pratique, et c'est globalement un mauvais conseil. Essayez de tester la mort du processus et voyez où votre application vous mène, et ce comportement est tout à fait standard "situation normale" si votre utilisateur utilise au moins 2-3 applications sur son téléphone et bascule entre elles.
EpicPandaForce
-3

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.

  1. mettez à jour le manifeste pour gérer l'orientation.

    android:configChanges="orientation|screenSize"
  2. ajouter ce code

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
Raul
la source
Vous devriez utiliser un service pour lire de la musique. Sérieusement, vous dites aux gens d'ajouter du code qui contient toujours "// TODO Auto-generated method stub". Solution bâclée. Cela ne fonctionnera pas très bien non plus, vous devrez relier toutes vos références, et si vous ne le faites pas, elles seront au mieux imprévisibles.
HAMMeReD