Aller au contenu

Rotation


Pierre87

Recommended Posts

Dans mon appli, j'ai des écrans assez "complexes" : ListView custom, etc ...

Lors de la rotation, l'Activity est complètement détruite.

Mis à part le fait que je trouve ce principe "bête" (je suis gentil)

Je me pose plusieurs questions :

Est ce que la "content view" de l'Activity est automatiquement réutilisée dans la nouvelle ?

Si non, est il pertinent de la réutiliser ?

ex : j'inflate manuellement une View pour ma "content view"

en cas de rotation, je la garde en mémoire (où ? comment ?)

et je la réutilise dans ma méthode "restore" ou "onCreate"

J'ai l'impression que la classe Bundle ne peut que sauvegarder des types simple.

Ne peut on pas envoyer des références d'objets à la nouvelle Activity ?

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Il faut utiliser http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29

et http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance()

Perso, je définis un objet contenant les références vers tout ce que j'ai envie de conserver lors du changement d'orientation (même l'adapter d'une ListActivity par exemple) mais rien qui ne soit lié aux Views elles-mêmes vu que leur contexte va être détruit.

A lire également : http://developer.android.com/resources/articles/faster-screen-orientation-change.html

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

Bonjour, j'essaye de suivre votre manière de faire, pour ne pas tout perdre lors de la rotation, mais impossible d'arriver à quoi que ce soit, l'application se plante lamentablement dans la suite au niveau du on create() après rotation. :(

C'est vraiment la galère la rotation sous android c'est affreux. :/

EDIT: ah non c'est bon j'ai trouvé la cause.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

En fait si j'ai un problème lors de ma rotation. Les éléments sont biens chargé, sauf que je me retrouve avec ce genre de problème:

Etat de la fenêtre avant rotation:

onegsm.png

Après rotation:

one1.png

Mais les éléments sont bien chargés en fait, car si on scroll ou si on fait + puis - ou si on donne le focus à un autre élement, l'affichage devient correcte:

one2.png

(et c'est valable dans les deux sens, et le problème ne se pose qu'avec les timepicker. :rolleyes:

Quelle en est la cause???

(c'est comme s'il donné le focus aux deux éléments avant que je ne les affectes et que donc ça n'était pas visible, du coup il faut faire quoi pour que ça marche proprement???

TIen c'est exactement ça:

http://osdir.com/ml/Android-Beginners/2009-10/msg01237.html

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

@Burn 2 : Désolé j'ai pas pigé le problème :s

En fait quand je fais une rotation le timepicker récupère le focus. Juste après la rotation mon curseur est dans le timepicker et toutes mes heures sont vides. Il faut que je sorte du time picker à la main ou face défiler pour que l'affichage soit correcte.

En fait il récupère le focus avant que j'affecte la valeur correcte et du coup on voit ce qu'on voit dans l'écran, je ne sais pas si c'est clair? Si tu veux comprendre le problème va en partie vos projet et installe sleepytux. Fait une rotation et tu comprendras le problème.

Lien vers le commentaire
Partager sur d’autres sites

Je galère un max pour la rotation. :(

Je n'arrive pas à sauvegarder mes objects et ça me réécrase tout. C'est vraiment une daube infâme la rotation sous android niveau dev. :(

En gros j'ai ça comme object que je veux sauvegarder:

private Profile m_profile;

private String m_profileName;

private int m_page;

Problème dans le onCreate ils sont forcément initialisés par défaut.

J'ai testé de passer outre en testant par exemple si m_page n'est pas vide etc, mais je me bouffe des erreurs si je ne réinitialise pas. :(

Help me sur ce coup là je ne vois vraiment pas comment garder mes états avant la rotation.

EDIT/ punaise c'est encore pire que je le pensais, lors de la rotation TOUT est réinitialisé! Donc il faut vraiment tout stocker, je pensais qu'il réexécutait juste "on create" mais non tout tout est supprimé et on repart à 0! Mais c'est n'importe quoi!

Pff comment stocker ces 3 valeurs en un object maintenant?

Faut se créer un conteneur (object) qui contiendra tout ça???? Si oui mon dieux que c'est mal foutu!

EDIT2: ok ça a marché comme ça, mais c'est vraiment n'importe quoi....

Il me reste toujours mon bug du timerpicker à 00 alors que ce n'est pas le cas. :/

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

En fait je pensais bêtement que seul le design était détruit (tout ce qui est contenu dans le xml donc, en gros je pensais que tous les éléments réapparaiçaient à vide non initialisé mais que les variables globales à la classe restaient) or c'est vraiment tout qui est détruit comme si on repartait à 0, ce que tu as du dire oui mais je n'avais pas compris comme ça.

Sinon il me reste toujours mon problème de time picker. Quand je fais la rotation, il passe à 0 alors qu'en fait réellement ce n'est pas le cas.

Genre il est à 6. Je fais la rotation il affiche 0. Mais si je sélectionne + ou moins il me met bien 7 ou 5 preuve qu'il est bien à 6 mais il ne l'affiche pas à l'origine, par contre si on scroll comme le premier élément perd le focus paf il affiche 6. :'( Je n'ai aucun idée de comment solutionner ce problème qui doit venir d'un problème de focus.

EDIT: non ça fait n'importe quoi pour les minutes aussi alors qu'elles sont bien chargées, cette fois si je fais plus ça ne rajoute pas ce qu'il faut alors que si je fais suivant puis précédent ça marche preuve que ce que j'ai récupéré a bien été chargé. je ne comprends vraiment pas ce qui cloche. :'(

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

J'ai trouvé la chose incompréhensible qui arrive!

En fait mes deux timepicker se mélangent les pédales! je ne comprends pas pourquoi!

En gros le timepiecker1.hour = time picker2.minutes

et timepicker1.minute=timepicker2.minutes

Je ne comprend vraiment pourquoi il fait ça à l'affichage. (mais pas qu'a l'affichage vu que timepicker.minute est vraiment = à timepicker2.minute car si je fais up down ça ne met pas la bonne valeur. JE ne comprend rien de ce qu'il fou! :'(

Je sauvegarde tout bien séparément mais ça ne marche pas.

J'aimerais comprendre pourquoi lors de la rotation il se mélange les pédale sur ses noms. je suis vraiment pommé là. C'est bien uniquement lors de la rotation.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Je vous présente le problème incompréhensible:

Voici l'état initial:

oneo.png

Si je fais suivant et back je récupère bien les bonnes valeurs donc la fonction "save" et "load" marche.

Maintenant je fais une rotation je me retrouve dans cet état directement après la rotation:

capturepak.png

Notez bien le day.minutes qui vient de prendre la valeur de night.minute sans raison!!!!

Et le day.hour qui est totalement vide... (sans doute parce que 59 heures ça n'existe pas!)

Je scroll juste et voici le résultat:

one1.png

day.hour est revenu à sa valeur réelle, mais day.minute est toujours faux!!!! et même si je fais + et - c'est faux!

Mais si je ne touche à rien et fait next puis back (donc la fonction load qui est appelée à nouveau!!!)

one2e.png

Et bien oui tout rentre dans l'ordre preuve que tout avait bien été chargé puisque je fais un save puis load à nouveau, mais je ne comprend pas pourquoi ce qui est affiché est totalement faux. Je ne comprends pas ce que c'est que cette c$$$$$$$$ :rolleyes:

:o

EDIt: en fait en réfléchissant, je sius sûr que le problème est sur le chargement dans le design des valeurs, les valeurs derrière sont vrais, mais le timepicker n'a pas l'air de vouloir s'affecter en fait.

EDIT3: c'est bien ça le problème, l'affichage ne se rafraichie pas....

activity.setCurrentMinute(m_profile.getJournee(page-1).getStart().minute);
          Toast.makeText(this,String.valueOf(m_profile.getJournee(page-1).getStart().minute),Toast.LENGTH_SHORT).show();

Bizarrement mon timepicker affiche toujours 59, alors que le toast m'affiche bien 02!

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Je n'avais pas mis la ligne dans le xml, mais en la rajoutant ça ne change strictement rien.

J'ai testé en rajoutant le invalidate dans ma sauvegarde avant la destruction donc, juste après avoir tout récupéré: ça ne change strictement rien!

Je vais tester dans le onConfigurationChanged mais je n'y crois pas du tout.

EDIT: ça ne change rien non plus ça me soule cette histoire incompréhensible.

EDIT2: lors de la rotation il ne passe pas dans onConfigurationChanged...

Mais bon de toute façon j'ai testé en mettant un invalidate dans le load ou lors de la sauvegarde de mes paramètres et ça ne change rien. Je ne comprends pas ce qui se passe avec les timeSpinner, c'est le seul élément qui me pose problème! Foutu programme tien!

Et le pire, c'est que même en interdisant la rotation il réinitialise quand même la fenêtre et donc j'ai quand même le bug. Mais ça me soule!!!!!

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

bon ok, on va repartir de 0

lors d'une rotation, Android détruit l'Activity en court, et en recrée une nouvelle (donc nouveau cycle de vie de l'Activity)

l'objet n'est pas le même, etc etc...

on aime, on n'aime pas... la question n'est pas là, c'est le comportement par DEFAUT :P

il existe des moyens pour restaurer l'Activity, mais c'est très chiant je trouve

le bout de code xml que je t'ai filé (à coller dans CHAQUE Activity de ton manifest) permet justement de changer ce comportement par défaut!

l'Activity n'est plus détruite!

tu gardes le même objet!

pas besoin de te casser la tête à restaurer tes données :D

revenons au début : pourquoi Android détruit l'Activity lors d'une rotation?

à mon avis, c'est pour pouvoir charger une nouvelle "content view", avec un layout différent en fonction de la rotation

il est impossible, je crois, de charger 2 fois une "content view" dans la vie d'une activity

le bout de code xml que je t'ai passé permet de dire : "c'est MOI qui gère la rotation"

en gros, ce n'est plus Android qui la gère, mais TOI

et cela se fait au travers de la méthode onConfigurationChanged

elle est appelé lorsque tu as décidé de gérer toi même le changement de configuration (rotation en l'occurence)

lis un peu la doc à ce sujet, ça te changera je pense... :P

si même en ayant appliqué ce que je viens de te dire, tes 2 timepicker bug toujours, c'est qu'il y a un bug au niveau de ce widget :P

d'après mon expérience, l'Activity n'étant pas détruite, les vues ne sont pas détruites non plus...

il est donc peut être nécessaire de les rafraichir lors d'une rotation :P

si tu as suivi, onConfigurationChanged est appelé après une rotation

donc c'est à cet endroit là que tu peux résoudre ton problème

tu peux donc essayer d'appeler timepicker.invalidate()

si ça ne marche toujours pas.... tu peux essayer de "set" leurs valeurs en ayant fait un "get" avant...

et un peu de code ne ferait pas de mal

Lien vers le commentaire
Partager sur d’autres sites

Je vais regarder tout ça, ok pour le manifeste etc, je vais me renseigner pour voir un peu tout ça.

J'ai trouvé un moyen de contourner le problème, si je retourne à la page 1 de mon "assistant" tout marche bien. c'est vraiment dès que je recharge la page 2 à 8 (celles ou y a les timepicker) dès le début que le problème se pose.

EN gros le timepicker est le seul élément qui me pose problème lors de la rotation et pourtant je suis sûr de bien lui passer les bonnes choses vu que je réutilise ma fonction load. Mais bon po grâve, je vais voir si je rerecherche pour gérer la rotation ou si je laisse comme ça.

Merci pour ta réponse et ta patience encore. Ma logique va toujours à l'encontre de ce qu'il faudrait faire, c'est vraiment effrayant. J'ai beau chercher googler etc, je ne trouve vraiment pas grand chose de vraiment bien décris sur quand on gère la rotation tout seul mais avec tes éléments ça doit être plus clair déjà.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

il n'y a justement RIEN à faire avec android:configChanges="orientation"

dans mon appli, j'ai des ListView affreusement compliquées, et des requêtes réseau lorsque mon Activity est ouverte

si je n'utilisait pas cette technique, mon appli ne pourrait pas fonctionner!

Lien vers le commentaire
Partager sur d’autres sites

il n'y a justement RIEN à faire avec android:configChanges="orientation"

dans mon appli, j'ai des ListView affreusement compliquées, et des requêtes réseau lorsque mon Activity est ouverte

si je n'utilisait pas cette technique, mon appli ne pourrait pas fonctionner!

En fait comme un boulet j'avais rajouté android:configChanges="orientation" dans les xml des activity...

Ce qui explique pourquoi ça ne marchait pas.

EDIT2: ok c'est bon j'ai rajouté le "keyboardhidden" et ça marche totalement maintenant merci de ton aide!!!

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...