У меня есть нижняя панель навигации, реализованная с пейджером просмотра. Теперь в первом фрагменте мне нужны вкладки вверху, поэтому мне нужен пейджер только внутри этого фрагмента. Этот пейджер представления будет иметь свой собственный набор фрагментов. Является ли это возможным? Может ли кто-нибудь помочь мне сделать это?
Просмотр пейджера внутри фрагмента
Ответы (4)
Да, это вполне возможно, так как ваш внутренний viewpager и tablayout будут независимы от своего родительского фрагмента. Процесс для достижения этого точно такой же, как вы использовали для создания своего первого набора вкладок, но вместо этого вы должны использовать getChildFragmentManager():
getChildFragmentManager().beginTransaction().add(R.id.yourinnercontainer, YourFragment.newInstance()).commit();
getChildFragmentManager().executePendingTransactions();
А для TabLayout просто создайте свои представления и используйте функцию setupWithViewPager(viewPager), как обычно.
Да, вы можете добавить viewPager в XML вашего фрагмента следующим образом:
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutDirection="ltr"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:contentInsetEnd="16dp"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:gravity="center|start"
android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.AppCompat.Title"/>
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:tabIndicatorHeight="3dp"
app:tabMode="fixed"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
и управляйте им в своем коде следующим образом:
ViewPager pager = (ViewPager) findViewById(R.id.pager);
mAdapter = new MyPagerAdapter(getSupportFragmentManager());
mAdapter.addFragment(first_fragment, firts_fragment_title);
mAdapter.addFragment(second_fragment, second_fragment_title);
pager.setAdapter(mAdapter);
TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
tabs.setupWithViewPager(pager);
TextView first_fragment_tab = (TextView) getLayoutInflater().inflate(R.layout.tab_indicator, null);
TextView second_fragment_tab = (TextView) getLayoutInflater().inflate(R.layout.tab_indicator, null);
tabs.getTabAt(0).setCustomView(first_fragment_tab);
tabs.getTabAt(1).setCustomView(second_fragment_tab);
pager.setCurrentItem(mAdapter.getCount());
Возможен вложенный Fragment
. Но фрагмент имеет тенденцию приносить новые проблемы, поэтому с интеграцией другого слоя фрагмента поверх него мы можем оказаться в большой беде. Если вы выполняете базовые операции, это может быть нормально, но если есть случаи обмена данными и другие зависимости между фрагментами, я бы посоветовал быть очень осторожным.
Да, это возможно!
Шаг 1: Создайте активность с вкладками. (Он автоматически создаст активность с ViewPager)
Шаг 2: Преобразуйте эту активность во фрагмент, чтобы иметь возможность добавить ее в свой BottomNavigation. Используйте этот ответ: Преобразование активности во фрагмент
Примечание. Я сделал это в проекте, и наличие других ViewPager
на других вкладках панели BottomNavigation сделало все немного сложнее. Использование viewPager.setOffscreenPageLimit(...);
решит некоторые из ваших возможных проблем.