2013-01-15 4 views
1

Je souhaite créer dynamiquement une liste de fragments par programmation avec des sous-vues avant d'ajouter les fragments. J'ai un fichier JSON qui configure chaque fragment avec une liste de vues, donc quand mon application démarre, il y a une activité appelée écran de démarrage qui montre juste une image pendant le traitement des données. Exemple rapide ci-dessous de moi en essayant de générer 3 fragments et mettre en place leurs sous-vues (ce qui est dans l'activité de l'écran de démarrage)Android Ajouter dynamiquement un fragment avec des sous-vues

for(int i = 0; i < 3; i++) 
     { 
      DefaultFragment frag = new DefaultFragment(); 
      RelativeLayout layout = (RelativeLayout) createUI(frag); 
      frag.setFragLayout(layout); 
     } 


private RelativeLayout createUI(final DefaultFragment frag_p) 
    { 

     RelativeLayout layout = new RelativeLayout(this); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     Button but = new Button(this); 
     but.setWidth(100); 
     but.setHeight(100); 
     but.setText("Next"); 

     but.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) 
      { 
       frag_p.testNextFragment(); 
      } 
     }); 
     layoutParams.setMargins(100, 100, 0, 0); 
     layout.addView((View) but, layoutParams); 

     return layout; 
    } 

Puis dans le fragment il y a un RelativeLayout appelé fraglayout

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
//took out layout inflator temp, to try using the relativeLayout which was set from the splash screen 
//  View V = inflater.inflate(R.layout.fraglayout, container, false); 


     return fragLayout; 
    } 

Cela permet moi d'ajouter les sous-vues au fragment ok, ce test implique simplement un bouton qui, lorsqu'il est pressé, vous amène au fragment suivant qui fonctionne bien, mais quand j'essaie d'aller au fragment précédent, j'obtiens l'erreur "L'enfant spécifié a déjà Un parent".

Je sais que cela est à cause de cette

Button but = new Button(this); 

Il devient le contexte de l'écran de démarrage et non le fragment, mais comment puis-je obtenir le contexte du fragment avant sa création?

Quelqu'un pourrait-il me suggérer une meilleure méthode pour ajouter les sous-vues aux fragments avant qu'ils ne soient montrés.

Toute aide serait appréciée

01-15 12: 25: 01,598: E/AndroidRuntime (3443): FATAL EXCEPTION: principale 1 au 15 décembre: 25: 01,598: E/AndroidRuntime (3443): java.lang.IllegalStateException: l'enfant spécifié a déjà un parent . Vous devez d'abord appeler removeView() sur le parent de l'enfant. 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à android.view.ViewGroup.addViewInner (ViewGroup.java:1976) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.view.ViewGroup.addView (ViewGroup.java:1871) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.view.ViewGroup.addView (ViewGroup.java:1828) 01 -15 12: 25: 01.598: E/AndroidRuntime (3443): au android.view.ViewGroup.addView (ViewGroup.java:1808) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à com.single.DefaultFragment.onCreateView (DefaultFragment.java:61) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à android.support.v4.app.FragmentManagerImpl.moveToS tate (FragmentManager.java:870) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1080) 01-15 12 : 25: 01.598: E/AndroidRuntime (3443): au android.support.v4.app.BackStackRecord.run (BackStackRecord.java:622) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1416) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.support.v4.app.FragmentManagerImpl $ 1.run (FragmentManager.java:420) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.os.Handler.handleCallback (Handler.java:587) 01-15 12:25:01. 598: E/AndroidRuntime (3443): au android.os.Handler.dispatchMessage (Handler.java:92) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.os.Looper. boucle (Looper.java: 123) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au android.app.ActivityThread.main (ActivityThread.java:3683) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à java.lang.reflect.Method.invokeNative (Méthode native) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): à java.lang.reflect.Method.invoke (Méthode. java: 507) 15/01 12: 25: 01,598: E/AndroidRuntime (3443): à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839) 01-15 12:25 : 01.598: E/AndroidRuntime (3443): au com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 01-15 12: 25: 01.598: E/AndroidRuntime (3443): au dalvik .system.Native Start.main (Native Method)

+0

Pouvez-vous publier la pile de pile avec l'exception? – Luksprog

+0

Trace de pile publiée. Une façon plus simple de reformuler ma question serait, comment puis-je ajouter des sous-vues à un fragment avant sa création. Comme je veux mettre en place une liste de fragments stockés dans un arraylist avant le chargement de l'activité du fragment, alors je peux juste faire la transition entre eux en utilisant l'arraylist. J'ai trouvé un travail, mais cela signifierait que toutes les variables et méthodes sont statiques, ce que je ne veux pas faire! – AdamM

+0

Pouvez-vous publier le code de la méthode 'onCreateView' pour le' DefaultFragment' tel qu'il est actuellement (et lancer cette exception)? – Luksprog

Répondre

0

cernées solution, dans mon fragment j'ai un ArrayList qui contient une liste d'objets, chaque fois que je clique sur le bouton pour aller à fragment suivant, ou le bouton retour pour revenir en arrière, je appel supprimer toutes les vues sur ma mise en page relative, et maintenant ça fonctionne bien.

Questions connexes