2010-06-07 3 views
0

J'ai une activité Android avec un RelativeLayout et je l'ai mis en œuvre la méthode suivante pour empêcher l'activité d'être recréée sur le changement d'orientation:Comment actualiser un RelativeLayout Android lorsque l'orientation change sans redémarrer l'activité?

@Override 
public void onConfigurationChanged(Configuration newConfig) {  
    super.onConfigurationChanged(newConfig); 

} 

Je suis évidemment pas en train de faire quoi que ce soit dans cette méthode, mais cela a fonctionné parfait lors de l'utilisation d'un LinearLayout. Maintenant, cependant, en utilisant RelativeLayout, ma mise en page est tout foiré lors du passage en mode paysage.

Quel est le moyen le plus efficace pour que l'écran se redessine correctement sans redémarrer l'activité avec un appel à onCreate?

+0

nous pourrions peut-être fournir de meilleures réponses si vous postez le fichier de mise en page qui cause le problème? – Janusz

Répondre

2

Vous avez deux façons:

  • Fidéliser un objet lors d'un changement de configuration
  • Manipulation du changement de configuration vous-même

Vous avez choisi la deuxième voie. Dans ce cas, vous devez réaffecter chaque ressource manuellement et cette approche n'est pas recommandée. À mon humble avis le meilleur moyen est le premier en mettant en œuvre la méthode: onRetainNonConfigurationInstance();

Here un exemple complet sur comment utiliser.

Note: le onCreate sera appelé à nouveau, mais vous pouvez ajuster votre code pour éviter de longue tâche de runnning être appelé à nouveau lors d'un changement de configuration

+0

Merci pour ce conseil. J'ai lu l'exemple que vous citez. Donc, il me semble que l'utilisation de onRetainNonConfigurationInstance() tue l'activité et la redémarre mais fournit un moyen de mettre en cache les données qui ont été chargées. C'est génial, mais vous devez toujours supporter le coût du redémarrage de l'activité et recharger toutes les vues ... Mais je suppose que c'est juste la façon dont cela doit être fait :) Donc, si on utilise onRetainNonConfigurationInstance() j'imagine que je ne devrais pas définir mon activité comme: android: configChanges = "keyboardHidden | orientation". Tout ce que je dois faire est de mettre en œuvre cette méthode? – JohnRock

+0

Vous mentionnez qu'en utilisant l'option 1, je dois "réaffecter chaque ressource à la main". Réaffecter chaque ressource, puis je suppose que cela signifie des méthodes d'appel comme 'TextView myView = findViewById (R.id.myTextView); myView.setText ("some content") 'à nouveau pour toutes les ressources affichées? – JohnRock

+0

"J'imagine que je ne devrais pas définir mon activité comme: android: configChanges =" keyboardHidden | orientation " Oui! Pour le deuxième commentaire, je veux dire: si vous fournissez d'autres ressources traitables pour le mode paysage et potrait en remplaçant onConfigurationChanged, vous devez affecter manuellement ces ressources alternatives. Vous pouvez choisir le bon poiter du paramètre newConfig qui est à jour. Pour le problème RelativeLayout, avez-vous essayé de l'invalider? –

2

Il y a une troisième voie et plus facile qui manque, en réponse Francescos.

Il suffit d'ajouter

android:configChanges="keyboardHidden|orientation" 

à l'étiquette d'activité de toutes les activités que vous ne voulez pas redémarrer sur un changement de mode paysage au mode portrait. Cela obligera l'OS à reconstruire votre mise en page sans le détruire avant la reconstruction. La méthode oncreate ne sera plus appelée et vous ne perdrez pas l'état de l'activité. Mais attention, ceci ne fonctionnera que si vous utilisez le même fichier de mise en page pour le mode portrait et paysage.

Voir cette question pour plus d'informations sur ce sujet

+0

Selon la documentation officielle, ajouter android: configChanges = "keyboardHidden | orientation" est simplement déclarer une activité qui va gérer les changements de configuration par lui-même. À mon humble avis, il ressemble à juste une autre déclinaison de la deuxième option –

+0

Oui c'est correct désolé si vous déclarez ceci et remplacez le onConfigurationChanged vous avez votre deuxième solution – Janusz

+0

Cette troisième voie est en fait exactement la façon dont je le fais dans mon exemple . Le problème est qu'il réussit à redessiner la mise en page pour LinearLayout, mais pas pour RelativeLayout - du moins pas sur le Nexus 1. – JohnRock

Questions connexes