Pierre87 Posté(e) 21 mai 2010 Share Posté(e) 21 mai 2010 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 ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 21 mai 2010 Share Posté(e) 21 mai 2010 (modifié) 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é 21 mai 2010 par Nivek Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 3 juillet 2010 Share Posté(e) 3 juillet 2010 (modifié) 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é 3 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 3 juillet 2010 Share Posté(e) 3 juillet 2010 (modifié) 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: Après rotation: 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: (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é 3 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 6 juillet 2010 Share Posté(e) 6 juillet 2010 @Pierre87 : gardez une référence sur ta vue est une très mauvaise idée. Il faut laisse le système la détruire et la recréer avec les ressources "landscape". @Burn 2 : Désolé j'ai pas pigé le problème :s Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 6 juillet 2010 Auteur Share Posté(e) 6 juillet 2010 problème réglé en fait android:configChanges="orientation" dans chaques Activity de mon manifest Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 @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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 12 juillet 2010 Share Posté(e) 12 juillet 2010 (modifié) 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é 12 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 12 juillet 2010 Auteur Share Posté(e) 12 juillet 2010 @Burn2 : t'as lu mon message? Je ne suis pas assez clair? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 12 juillet 2010 Share Posté(e) 12 juillet 2010 (modifié) 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é 12 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 12 juillet 2010 Share Posté(e) 12 juillet 2010 (modifié) 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é 12 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 12 juillet 2010 Share Posté(e) 12 juillet 2010 (modifié) Je vous présente le problème incompréhensible: Voici l'état initial: 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: 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: 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!!!) 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é 12 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 12 juillet 2010 Auteur Share Posté(e) 12 juillet 2010 ok, on va faire simple : as tu bien fait ce que je t'ai dis ? android:configChanges="orientation" dans chaques Activity de mon manifest si là ça bug toujours, fais un invalidate sur tes timepicker dans le onConfigurationChanged de ton activity Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 13 juillet 2010 Share Posté(e) 13 juillet 2010 (modifié) 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é 13 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 13 juillet 2010 Auteur Share Posté(e) 13 juillet 2010 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 13 juillet 2010 Share Posté(e) 13 juillet 2010 (modifié) 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é 13 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 13 juillet 2010 Auteur Share Posté(e) 13 juillet 2010 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! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 13 juillet 2010 Share Posté(e) 13 juillet 2010 Pierre87 : je t'invite à ajouter un petit texte dans le wiki à ce propos http://wiki.frandroid.com/wiki/Orientation_des_Android_Activity Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 13 juillet 2010 Auteur Share Posté(e) 13 juillet 2010 demain ! "moe time" ce soir :D Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 14 juillet 2010 Share Posté(e) 14 juillet 2010 (modifié) 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é 14 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 14 juillet 2010 Share Posté(e) 14 juillet 2010 (modifié) Erreur... Modifié 14 juillet 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.