2010-11-30 35 views
3

Lors du démarrage d'une certaine activité de mon application, l'utilisateur est "accueilli" avec une boîte de dialogue qu'il doit remplir avec certaines données pour pouvoir continuer. Ensuite, dans l'activité proprement dite, l'utilisateur dispose de 2 boutons lui permettant de créer dynamiquement et supprimer un nombre infini de champs (composés de plusieurs vues)Meilleure façon de gérer l'orientation de l'écran Modifier lorsque vous travaillez avec des vues créées dynamiquement?

Comme vous le savez, lorsque l'orientation de l'écran change, l'activité est redémarré de sorte que toutes les informations sont perdues. Évidemment, cela peut être problématique.

Afin de gérer l'orientation de l'écran, la documentation android conseille aux développeurs d'utiliser onRetainNonConfigurationInstance(). Le seul problème est que si vous l'utilisez pour enregistrer des objets dans un contexte, toutes les vues liées fuiront. Ceci est encore plus problématique dans mon cas, puisque les données de cette activité sont intrinsèquement liées à sa vue, qui, à son tour, est liée à son contexte.

La documentation Android ne recommande pas aux développeurs de gérer eux-mêmes les modifications de configuration. Ils déclarent (et je cite) "en général, une solution à court terme qui ne fera que compliquer leurs vies plus tard"

Je peux facilement contourner le dialogue initial, en créant un booléen hasBeenShown et le mettre à true, par exemple. Je peux même contourner le problème des "vues créées dynamiquement" en sauvegardant leurs métadonnées: dans ce cas le nombre de champs générés, leur type, leur position relative, leur texte ou leur sélection, etc. (avec quelques légères bugs, mais rien de grave). Mais comme les champs (vues) sont générés dynamiquement avec layoutInflate (et donc nous pouvons avoir un nombre infini de vues), lorsque vous générez ces mêmes champs après un changement d'orientation, l'application devient vraiment très lente même sur émulateur. Avec 20 champs (environ 120 vues) sur un appareil réel (Samsung Galaxy S), il a fallu près d'une minute pour terminer. Bizarrement, lorsque je passais des vues directement (et donc que je perdais tout ça), mon Samsumg Galaxy S prenait moins de 10 secondes pour terminer. Avec cette information, quelle est selon vous la meilleure approche?

(1) - Permet de réinitialiser les champs? (pas vraiment une option, je parie que n'importe qui serait énervé si elles inclinaient par inadvertance leur écran = P)

(2) - Ajouter un écran de chargement alors que Android prend soin de changer l'orientation de l'écran?

(3) - orientation de l'écran Bloc changement

(4) - Poignée orientation de l'écran changer moi-même, et espère que les docs qui font obstacle Doom Android parlent ne vient jamais. P.: Un peu offtopique, mais quand mon activité se termine, toute la mémoire est libérée?

Répondre

6

Votre situation est différente de la mienne, mais une solution similaire peut être en ordre. Encore une fois, parce que Android va détruire et recréer sur un changement d'orientation, j'ai d'abord eu des problèmes avec les tâches asynchrones faisant la communication réseau. Évidemment, je ne devrais pas créer de nouvelles demandes à chaque changement d'orientation lorsque le premier est toujours en cours d'exécution.

Pour économiser l'utilisation du réseau et les maux de tête, je gère simplement le changement d'orientation moi-même. En plaçant ce code dans votre AndroidManifest.xml

<activity android:name=".whatever" android:configChanges="keyboardHidden|orientation"/> 

vous permettent de garder Android le contexte actuel, avec des vues et des variables etc. Ce qui se passe est les mises en page redimensionnent eux-mêmes, mais si vous avez conçu correctement, alors vous devriez être ok. AFAIK la seule chose que j'empêche Android de faire est d'utiliser des mises en page spécialisées en fonction de l'orientation de l'appareil (dont je n'ai pas besoin) et jusqu'à présent, je n'ai pas été frappé par la menace imminente annoncée.

+0

Wel, la disposition ne sont pas un problème. Le fond devient un peu étiré, mais je peux même le changer moi-même. Il semble, de loin, la façon sensée de faire parce que: A) Je n'ai besoin d'aucune disposition spéciale d'orientation B) Son, de loin le plus rapide (prend 2 secondes en haut) c) C'est le plus facile aussi D) et si le apocalypse arrive finalement, je peux libérer une solution rapide, désactivant le changement d'orientation. Si personne d'autre n'a quelque chose à ajouter, la coche verte est à vous ^^ – Tivie

+0

Pour l'arrière-plan, si vous utilisez un 9patch drawable Android peut l'échelle/étirer bien aussi. Mais certaines choses fonctionnent mieux quand vous en avez une séparée pour chaque orientation – smith324

+0

C'est une bonne suggestion, mais malheureusement cet arrière-plan ne peut pas être converti correctement en un patch 9. Je pourrais le changer si bien qu'il peut être adapté dans un 9patch. ^^ – Tivie