2010-07-27 2 views
4

Est-il possible de charger mon fichier de mise en page main.xml dans onCreate(), puis plus tard dans l'application, passer à une nouvelle mise en page XML? J'ai essayé de placer setContentView() plus tard dans l'application, mais cela ne semble pas réellement définir la nouvelle vue parce que mes références aux objets dans le fichier de mise en page xml nouvellement défini retournent comme nulle. J'ai essayé de faire un peu de mise en page en utilisant LayoutInflater mais je n'ai pas de chance (je fais probablement quelque chose de mal) ...Est-il possible d'échanger des mises en page XML pendant l'exécution sous Android?

Y a-t-il un autre moyen d'échanger des mises en page XML lors de l'exécution? Merci!

Répondre

11

Vous pouvez avoir vos dispositions dans un seul fichier xml. Ceux que vous ne voulez pas voir immédiatement, définissez android:visibility="gone" dans le fichier XML, et lors de l'exécution, vous appelez hiddenView.setVisibility(View.VISIBLE);.

Votre XML ressemblerait à quelque chose comme ceci:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout android:id="@+id/layout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    </LinearLayout> 
    <LinearLayout android:id="@+id/layout2" 
     android:visibility="gone" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    </LinearLayout> 
</RelativeLayout> 

lors de l'exécution que vous pourriez faire:

layout1.setVisibility(View.GONE); 
layout2.setVisibility(View.VISIBLE); 

Ceci essentiellement créer l'apparence de l'échange de mises en page.

Je crois que cela fonctionnerait également si vous avez partagé des objets entre les deux mises en page. Assurez-vous simplement d'avoir défini l'ID en premier en utilisant android:id="@+id/view1" et tous les réglages suivants de cet identifiant vous feriez android:id="@id/view1" (sans le +).

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout android:id="@+id/layout1" 
     android:layout_width="fill_parent"> 
     <View android:id="@+id/view1"/> 
    </LinearLayout> 
    <LinearLayout android:id="@+id/layout2" 
     android:visibility="gone" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <View android:id="@id/view1"/> 
    </LinearLayout> 
</RelativeLayout> 
+1

J'aime beaucoup cette réponse. Personnellement, j'utilise un ViewFlipper pour gérer plusieurs mises en page afin de ne pas avoir à gérer les variables [Ressource] entrant dans la portée et à l'extérieur lorsque leur mise en page est définie sur la vue du contenu. Les deux approches sont viables. –

+0

Ah, je n'ai aucune expérience avec la classe ViewFlipper. Je devrais vérifier la prochaine fois que je dois faire quelque chose comme ça. – SSZero

+0

Oh wow qui a parfaitement fonctionné: D Merci! – justinl

1

Vous ne créez pas une nouvelle activité? Sinon, je pense que vous voudrez peut-être supprimer les vues du conteneur principal et reconstruire votre code creux. setContentView ne peut être appelé qu'une seule fois par activité si je me souviens bien ...

+0

Hi! Malheureusement, j'ai essayé de faire une nouvelle activité, mais j'ai besoin que la transition soit transparente. Il semble que lors du chargement de la nouvelle activité, il y ait du temps de chargement, ce que je ne peux pas avoir. – justinl

+0

ps - Je crois que vous avez raison sur le fait que setContentView() n'est autorisé à appeler qu'une seule fois. Il ne lance pas d'exception mais lorsque j'essaie d'accéder à des mises en page à l'aide de findViewById(), il me donne un pointeur nul en essayant de référencer ces variables. – justinl

+0

En effet, si vous souhaitez accéder à des vues en dehors de setContentView, vous devez suivre les conseils d'EboMike. De cette façon, vous pouvez appeler findViewById sur la vue renvoyée par l'inflateur. – Sephy

1

Je pense aussi que cela ressemble vraiment à une nouvelle activité, mais je crois que vous pouvez regonfler quelque chose si vous supprimez manuellement les vues existantes et puis appelez getLayoutInflater().inflate(resourceId, rootViewGroup).

+0

Merci pour votre réponse. Je vais essayer ça la prochaine fois que je serai coincé! – justinl

Questions connexes