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)
Pouvez-vous publier la pile de pile avec l'exception? – Luksprog
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
Pouvez-vous publier le code de la méthode 'onCreateView' pour le' DefaultFragment' tel qu'il est actuellement (et lancer cette exception)? – Luksprog