У меня есть приложение с левым навигационным ящиком, переключающимся между различными фрагментами. Внутри одного из этих фрагментов я хочу реализовать SlidingTabLayout
.Фрагмент с SlidingTabLayout
Итак, что я сделал, я скопировал SlidingTabLayout.java
и SlidingTabStrip.java
из приложения iosched
от Google. Я использовал их в моем фрагменте:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<mynamespace.widget.SlidingTabLayout
android:id="@+id/home_fragment_tabs"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<android.support.v4.view.ViewPager
android:id="@+id/home_fragment_pager"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_width="match_parent" />
</LinearLayout>
И тогда в моем классе Фрагмент внутри метода onCreateView, я экземпляр моего пейджера и SlidingTabLayout вроде этого:
mPager = (ViewPager) view.findViewById(R.id.home_fragment_pager);
mPager.setAdapter(new HomePagerAdapter(getActivity().getSupportFragmentManager()));
mTabs = (SlidingTabLayout) view.findViewById(R.id.home_fragment_tabs);
mTabs.setViewPager(mPager);
И это мой FragmentPagerAdapter:
class HomePagerAdapter extends FragmentPagerAdapter
{
private String[] tabs = { "Today", "This week", "With star" };
private Fragment[] tabFragments = {
new TodayTabFragment(),
new WeekTabFragment(),
new StarTabFragment()
};
public HomePagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int i)
{
return tabFragments[i];
}
@Override
public int getCount()
{
return 3;
}
@Override
public CharSequence getPageTitle(int position)
{
return tabs[position];
}
}
Также у меня есть отдельный класс Фрагмента и макет для каждой вкладки, что ничего особенного. И это работает, но как только я переключаюсь на другой фрагмент с помощью своего навигационного ящика, когда я возвращаюсь, содержимое одной из вкладок просто исчезает. В основном это происходит со второй вкладкой. Кроме того, если я выбираю HomeFragment
навигации ящика, когда уже отображается, я получаю NullPointerException внутри SlidingTabLayout.java
на этой линии: mViewPager.setCurrentItem(i);
Любой способ фиксации его? Я понятия не имею, что делать. Я думаю, мой код будет работать, но внутри деятельности. Можно заставить его работать внутри фрагмента?
Можете ли вы дать кусок исходного кода активности, которая изменяет фрагменты? Не устанавливайте адаптеры в onCreateView, установите его в onActivityCreated ... –
'@Override public void onNavigationDrawerItemSelected (int position) { { FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction() .replace (R.id.main_content, фрагменты [позиция]) .commit(); } ' – Orochi
Я думаю, что вы должны всегда создавать новый объект фрагмента (не использовать старые экземпляры-фрагменты [позиция]). Потому что, когда вы создаете новый экземпляр, вам гарантируется, что будут вызываться все жизненные циклы фрагментов (onCreate, onCreateView, onActivityCreated и т. Д.) (И, следовательно, будет создан новый экземпляр HomePagerAdapter) ... –