J'ai besoin d'aide pour travailler sur un fragment à l'intérieur d'un fragment, en fait, je suis confronté à un problème en appuyant sur le bouton Retour. L'écran principal de l'application comporte des boutons et en appuyant sur chaque bouton, le remplacement par un nouveau fragment (et ce fragment contient un autre fragment), l'ajout / le remplacement dynamique du fragment fonctionne correctement, en appuyant sur le bouton1 fragment remplacé, la même chose se produit lorsque vous appuyez sur le bouton, mais si j'appuie sur le bouton à nouveau, a obtenu une exception:
"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"
signifie que des fragments ou des fragments internes sont déjà ajoutés et que j'essaye de les ajouter à nouveau, tout le monde a une idée de la façon de travailler avec un fragment à l'intérieur d'un fragment et de se déplacer sans problème, merci pour le soutien.
MainActivity, où les fragments sont ajoutés et remplacés dynamiquement.
public class FragmentInsideFragmentTestActivity extends Activity {
private Button button1;
private Button button2;
private Button button3;
private Button button4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 =(Button) this.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button2 =(Button) this.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button3 =(Button) this.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button4 =(Button) this.findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
}
public void onButtonClick(View v) {
Fragment fg;
switch (v.getId()) {
case R.id.button1:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button2:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button3:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button4:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
}
}
private void replaceFragment(Fragment newFragment) {
FragmentTransaction trasection = getFragmentManager().beginTransaction();
if(!newFragment.isAdded()) {
try {
//FragmentTransaction trasection =
getFragmentManager().beginTransaction();
trasection.replace(R.id.linearLayout2, newFragment);
trasection.addToBackStack(null);
trasection.commit();
} catch (Exception e) {
// TODO: handle exception
// AppConstants.printLog(e.getMessage());
} else {
trasection.show(newFragment);
}
}
}
Voici la mise en page: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:text="Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button3"
android:text="Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button4"
android:text="Button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</LinearLayout>
J'espère que j'ai essayé de résoudre mon problème.
la source
Réponses:
AFAIK, les fragments ne peuvent pas contenir d'autres fragments.
METTRE À JOUR
Avec les versions actuelles du package de support Android - ou des fragments natifs de niveau API 17 et supérieur - vous pouvez imbriquer des fragments au moyen de
getChildFragmentManager()
. Notez que cela signifie que vous devez utiliser la version du package Android Support des fragments sur les niveaux d'API 11 à 16, car même s'il existe une version native des fragments sur ces appareils, cette version n'en a pasgetChildFragmentManager()
.la source
getChildFragmentManager()
et la suppressionsetRetainInstance(true)
du fragment interne (dommage) l'ont corrigé. Merci d'avoir encore gardé mon bacon, @CommonsWare.J'avais besoin d'un peu plus de contexte, alors j'ai fait un exemple pour montrer comment cela est fait. La chose la plus utile que j'ai lue lors de la préparation était la suivante:
Activité
activity_main.xml
Ajoutez un
FrameLayout
à votre activité pour contenir le fragment parent.MainActivity.java
Chargez le fragment parent et implémentez les écouteurs de fragment. (Voir la communication fragmentée .)
Fragment parent
fragment_parent.xml
Ajoutez un autre
FrameLayout
conteneur pour le fragment enfant.ParentFragment.java
Utilisez
getChildFragmentManager
dansonViewCreated
pour configurer le fragment enfant.Fragment d'enfant
fragment_child.xml
Il n'y a rien de spécial ici.
ChildFragment.java
Il n'y a rien de trop spécial ici non plus.
Remarques
la source
Depuis que les fragments imbriqués Android 4.2 (API 17) sont disponibles http://developer.android.com/about/versions/android-4.2.html#NestedFragments
Pour placer un fragment dans un autre fragment, utilisez getChildFragmentManager ()
Il est également disponible dans la bibliothèque de support!
la source
Des fragments peuvent être ajoutés à l'intérieur d'autres fragments, mais vous devrez ensuite le supprimer du fragment parent à chaque fois que la
onDestroyView()
méthode du fragment parent est appelée. Et ajoutez-le à nouveau dans laonCreateView()
méthode de Parent Fragment .Faites comme ceci:
la source
onActivityCreated()
il a ajouté deux fragments, un dans chacune des vues, en utilisantgetFragmentManager()
. Cela a fonctionné la première fois, mais lors de la rotation et de la reprise, un seul des fragments était visible. Le comportement était correct avec à lagetChildFragmentManager()
place. L'approche suggérée ici a jeté une exception puisque l'activitéonSaveInstanceState()
avait déjà été appelée. La validation de la transaction en utilisant acommitAllowingStateLoss()
évité l'exception mais n'a pas résolu le problème d'origine.J'ai résolu ce problème. Vous pouvez utiliser la bibliothèque de support et
ViewPager
. Si vous n'avez pas besoin de faire glisser votre doigt par geste, vous pouvez désactiver le balayage. Voici donc du code pour améliorer ma solution:PSIt est un code moche pour le test, mais il améliore que c'est possible.
Le fragment PPS Inside
ChildFragmentManager
doit être transmis àViewPagerAdapter
la source
vous pouvez utiliser
getChildFragmentManager()
fonction.exemple:
Fragment parent:
Disposition parent (
parent_fragment.xml
):Fragment d'enfant:
la source
Ce n'est rien de compliqué. Nous ne pouvons pas utiliser
getFragmentManager()
ici. Pour utiliser des fragments dans un fragment , nous utilisonsgetChildFragmentManager()
. Le repos sera le même.la source
Vous pouvez ajouter
FrameLayout
au fragment et le remplacer par un autre fragment lors de son initialisation.De cette façon, vous pouvez considérer que l'autre fragment se trouve à l'intérieur du premier fragment.
la source
Utilisez getChildFragmentManager (), suivez le lien: Fragment imbriqué
la source
Actuellement dans le fragment imbriqué, le ou les imbriqués ne sont pris en charge que s'ils sont générés par programme! Donc, pour le moment, aucune disposition de fragment imbriqué n'est prise en charge dans le schéma de disposition xml!
la source
Cela peut aider ceux qui travaillent sur Kotlin, vous pouvez utiliser la fonction d'extension, alors créez un fichier kotlin, disons "util.kt" et ajoutez ce morceau de code
Disons que c'est la classe de l' enfant
Vous pouvez maintenant ajouter les enfants au fragment père comme ceci
où R.id.fragmet_field est l'id du layout qui contiendra le fragment. Ce lyout est à l'intérieur du fragment père bien sûr. Voici un exemple
Father_fragment.xml :
la source
Il n'y a pas de support pour
MapFragment
, l'équipe Android dit qu'il y travaille depuis Android 3.0. Voici plus d'informations sur le problème Mais ce que vous pouvez faire en créant un fragment qui renvoie un fichierMapActivity
. Voici un exemple de code. Merci à inazaruk:Comment ça fonctionne :
FragmentActivity
et héberge deux MapFragments.MapView.
LocalActivityManagerFragment
héberge LocalActivityManager.LocalActivityManagerFragment
et avec l'aide deTabHost
crée une instance interne de MyMapActivity.Si vous avez le moindre doute, faites-le moi savoir
la source
Salut, j'ai résolu ce problème en mettant par Fragment dans une mise en page distincte, et j'ai rendu visible la mise en page associée et fait disparaître les autres visibilités.
Je veux dire:
J'ai supposé que vous ouvririez votre page lorsque le bouton 1 est cliqué.Vous pouvez contrôler la visibilité de votre fragment sur l'action de clic.Vous pouvez rendre la mise en page associée visible et les autres parties et par Fragment Manager, vous pouvez prendre votre fragment.Cette approche a fonctionné pour moi. Et puisque la vue qui a de la visibilité: parti est invisible et ne prend pas de place pour la mise en page, je pense que cette approche ne pose aucun problème d'espace.
PS: j'ai juste essayé d'expliquer que le code de ma solution peut avoir des erreurs de syntaxe ou une structure incomplète.
la source