2016-06-02 2 views
0

фрагмента А содержит ViewPager, который имеет Фрагмент Б. Фрагмент B содержит RecyclerView и нажав на его элементов, открывает фрагмента C.Замена Фрагмент внутренних частей ViewPager Открытие фрагмента в ViewPager Размеры

Open Фрагмент C (реализован Фрагмент Б)

private void openItemPage(long id) { 
     Fragment a2Fragment = CompanyPageFragment.newInstance(id); 
     FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 

     // store the Fragment in stack 
     transaction.addToBackStack(null); 
     transaction.replace(R.id.container, a2Fragment).commit(); 
    } 

Фрагмент макета

<LinearLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:paddingTop="15dp"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="15dp" 
      android:background="@drawable/top_bottom_border" 
      app:tabBackground="@android:color/transparent" 
      app:tabIndicatorHeight="0dp" 
      app:tabMode="fixed"> 
     </android.support.design.widget.TabLayout> 

     <ir.barandeh.android.views.NonSwipeableViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:overScrollMode="never"/> 
    </LinearLayout> 

Фрагмент B Макет

<RelativeLayout android:id="@+id/container" 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

    <android.support.v4.widget.ContentLoadingProgressBar 
     android:id="@+id/contentLoading" 
     style="?android:attr/android:progressBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"/> 

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/refresh" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:overScrollMode="never" 
      android:paddingEnd="10dp" 
      android:paddingStart="10dp"> 

     </android.support.v7.widget.RecyclerView> 

    </android.support.v4.widget.SwipeRefreshLayout> 
</RelativeLayout> 

Фрагмент C Макет

<RelativeLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="?android:attr/windowBackground"> 

      <android.support.v4.widget.NestedScrollView 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fillViewport="true" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

       <ir.barandeh.android.views.NonSwipeableViewPager 
        android:id="@+id/pager" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:overScrollMode="never"/> 
      </android.support.v4.widget.NestedScrollView> 

    </RelativeLayout> 

Проблема заключается в том, содержание фрагмента С показана внутренняя часть ViewPager не весь макет фрагмента A.

+0

Мы не можем увидеть макет фрагмента B, но мое предположение было бы, что R .id.container используется для нескольких «ViewGroup». Убедитесь, что файл R.id.container не является идентификатором одного из видов в «RecyclerView» и т. Д. Вы также можете использовать инструмент иерархии представлений, чтобы проверить, где размещен новый фрагмент, и что он заменяет вместо ожидаемого. – frozenkoi

+0

@frozenkoi Я обновил свой вопрос с помощью макетов фрагментов. Можете ли вы просмотреть макеты, пожалуйста? удаление идентификаторов не помогло. – Alireza

+0

Все 3 макета имеют корень с идентификатором 'container'. К какому классу принадлежит 'openItemPage'? Это будет важно для того, чтобы вы могли четко понимать, какой менеджер фрагментов используется для замены фрагментов. Обратите внимание, что документы для 'getChildFragmentManager' (https://d.android.com/reference/android/app/Fragment.html#getChildFragmentManager()) говорят, что он возвращает менеджера для размещения внутри текущего фрагмента, контрастируя с' getFragmentManager 'который возвращает менеджер для верхнего уровня. Поэтому, если функция 'openItemPage' является частью фрагмента B, она не увидит родительский' container'. – frozenkoi

ответ

-1

Вы пытаетесь программно заменить LinearLayout, а также ожидая его, чтобы жестко зашитых детей. Это не сработает. Вы должны использовать FrameLayout для вашего FragmentTransaction, который также является дочерним элементом вашего layout_root.

Проголосовано https://stackoverflow.com/a/18885196/3749773. Благодаря Paul Burke

Другой ошибка была вызывающей getChildFragmentManager() из фрагмента B, но я должен был назвать его из фрагментов A. Благодаря frozenkoi

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