2015-11-07 5 views
1

ViewPager with 3 pagesUn fragment imbriqué n'apparaît pas dans un ViewPager

La photo ci-jointe montre une ViewPager avec 3 pages. Chaque page est implémentée en tant que fragment. La barre d'outils comporte une icône + en noir pour l'ajout d'un nouveau patient. Lorsque l'icône + est pressée, un fragment imbriqué doit être créé dans la page Patients, ce qui permet la création d'un nouveau patient.

Dans Logcat, je peux voir que les rappels du cycle de vie des fragments pour le fragment imbriqué sont appelés jusqu'à onResume(), mais la vue du fragment imbriqué n'est pas restituée.

Je fais cela pour créer le fragment imbriqué et l'insérer dans la hiérarchie de vue fragment parent:

FrPatientDetails frChild = new FrPatientDetails(); 
FragmentTransaction transaction = getChildFragmentManager().beginTransaction() 
       .replace(R.id.flPatientsPage, frChild); 
       transaction.addToBackStack(null) 
       .commit(); 

R.id.flPatientsPage est un FrameLayout dans la page Les patients où je suis en train d'insérer le fragment imbriqué. J'ai l'impression que la façon d'insérer un fragment enfant dans un fragment parent hébergé dans un ViewPager peut être différente, mais je ne sais pas quoi faire.

Quelqu'un pourrait-il aider ici?

Mise à jour: Ajout de la xml pour la page Patients (parent)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/patients_page_linear_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@+id/lvHomeViewPatientsPage" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:divider="@color/colorPrimary" 
    android:dividerHeight="1dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="8dp" 
    android:textColor="@android:color/black" /> 

<TextView 
    android:id="@+id/tvEmpty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:textColor="@android:color/black" 
    android:text="@string/patients_page_empty" 
    android:fontFamily="sans-serif" 
    android:gravity="center" 
    android:textSize="16sp" 
    /> 
<FrameLayout 
    android:id="@+id/flPatientsPage" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</LinearLayout> 

Mise à jour: Voici la capture d'écran après avoir suivi ce @Filo suggéré: Child fragment view superimposed on the parent fragment

+0

Avez-vous essayé avec 'add' au lieu de' replace'? – Fllo

+0

Oui. J'ai essayé 'add' et' repalce' et les deux donnent le même résultat. – Amit

+0

le signe plus ajoute un fragment imbriqué en rapport avec le fragment affiché –

Répondre

2

Pour résumer, le problème est ici que J'étais face à: Il y a une activité A contenant un TabLayout et ViewPager(V). V contient 3 pages (fragments). Un des fragments (F1) contient un fragment enfant C. J'ai pu afficher F1. Je ne pouvais pas afficher C lorsque l'utilisateur cliquait sur un bouton en F1.

Solution: V a utilisé un FragmentPagerAdapter pour configurer les fragments. À l'intérieur FragmentPagerAdapter.getItem(), faire pas lancement F1 directement. Au lieu de cela, lancez un fragment appelé F1Wrapper qui contient un FrameLayout. À l'intérieur F1Wrapper.onCreateView(), créez un FragmentTransaction en ajoutant F1 au backstack. Utilisez getChildFragmentManager pour créer la transaction. Passez le FrameLayout de F1Wrapper en tant que conteneur de vue pour F1.

Lorsque l'utilisateur clique sur le bouton dans F1 pour lancer le fragment C, créez un FragmentTransaction.replace() dans F1Wrapper qui ajoute C au backstack. Utilisez getChildFragmentManager pour créer la transaction. Encore une fois, passez le FrameLayout de F1Wrapper comme le conteneur de vue pour C. C remplacera maintenant F1 dans le backstack et sera affiché.

Remarque: Vous ne pouvez pas passer le ViewPager en tant que conteneur de vue pour C. C'est le nœud du problème et la principale raison pour laquelle nous devons utiliser un fragment de wrapper. Si vous passez V en tant que conteneur de vue pour C, C.onCreateView() tombera en panne.