2015-11-07 3 views
1

ViewPager with 3 pagesВложенный фрагмент не отображается внутри ViewPager

Прилагаемый картина показывает ViewPager с 3 страниц. Каждая страница реализована как фрагмент. На панели инструментов есть значок + в черном для добавления нового пациента. Когда нажимается значок +, внутри страницы «Пациенты» должен быть создан вложенный фрагмент, который позволяет создать нового пациента.

В Logcat я вижу, что обратные вызовы жизненного цикла фрагмента для вложенного фрагмента называются right upto onResume(), но представление для вложенного фрагмента не отображается.

Я делаю это, чтобы создать вложенный фрагмент и вставить его в иерархию родительского вида фрагмента:

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

R.id.flPatientsPage находится на странице пациентов, в которую я пытаюсь вставить вложенный фрагмент длина FrameLayout.

У меня возникает ощущение, что способ вставить дочерний фрагмент в родительский фрагмент, размещенный в ViewPager, может быть другим, но я не понимаю, что делать.

Помог ли кто-нибудь здесь.

Обновление: Добавлена ​​XML для страницы пациентов (родителя)

<?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> 

Update: Это скриншот после того, как после того, что предложил @Filo: Child fragment view superimposed on the parent fragment

+0

Вы пытались с 'add' вместо' replace'? – Fllo

+0

Да. Я попробовал 'add' и' repalce' и оба дали тот же результат. – Amit

+0

знак плюса добавляет вложенный фрагмент, относящийся к фрагменту, который находится на дисплее. –

ответ

2

Итак, здесь проблема, Я стоял лицом к лицу: Существует деятельность А, содержащая TabLayout и ViewPager(V). V содержит 3 страницы (фрагменты). Один из фрагментов (F1) содержит дочерний фрагмент C. Мне удалось отобразить F1. Мне не удалось отобразить C, когда пользователь нажал кнопку в F1.

Решение: V использовал FragmentPagerAdapter для установки фрагментов. Внутри FragmentPagerAdapter.getItem(), do не Запуск F1 напрямую. Вместо этого запустите фрагмент под названием F1Wrapper, который содержит FrameLayout. Внутри F1Wrapper.onCreateView() создайте FragmentTransaction, добавив F1 к стопке. Для создания транзакции используйте getChildFragmentManager. Пропустите FrameLayout F1Wrapper в качестве контейнера просмотра для F1.

Когда пользователь нажимает кнопку в F1 для запуска фрагмента C, создайте FragmentTransaction.replace() в F1Wrapper, который добавляет C к стопке. Для создания транзакции используйте getChildFragmentManager. Опять же, передайте FrameLayout F1Wrapper в качестве контейнера представления для C. C. теперь заменит F1 в backstack и будет отображаться.

Примечание: не может передать ViewPager как контейнер представления для C. Это суть проблемы и основная причина, почему нам нужно использовать фрагмент обертки. Если вы передадите V в качестве контейнера представления для C, произойдет сбой C.onCreateView().

Смежные вопросы