我有一个带左导航抽屉的应用程序,在不同的片段之间切换。在其中一个片段中我想实现SlidingTabLayout
。
所以,我做的是从Google的SlidingTabLayout.java
应用中复制了SlidingTabStrip.java
和iosched
。我在片段中使用了它们:
<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>
然后在我的Fragment类中,在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];
}
}
此外,我为每个标签都有单独的Fragment类和布局,这没什么特别的。它可以工作,但只要我用导航抽屉切换到其他片段,当我回来时,其中一个标签的内容就会消失。大多数情况下,它发生在第二个标签此外,如果我从导航抽屉中选择HomeFragment
,则已显示何时,我会在SlidingTabLayout.java
内的此行中获得nullpointerexception:mViewPager.setCurrentItem(i);
任何修复方法?我不知道该怎么做。我想我的代码可行,但内部活动。可以让它在片段内工作吗?
答案 0 :(得分:1)
我也面临同样的问题。请使用FragmentStatePagerAdapter而不是FragmentPagerAdapter来解决这个问题。
答案 1 :(得分:0)
解决方案:
我所做的不是实现FragmentPagerAdapter,而是实现了PagerAdapter,然后我重写了instantiateItem(ViewGroup容器,int位置)方法和destroyItem()方法。
答案 2 :(得分:0)
您可以尝试将HomePagerAdapter
的构造函数更改为:
public HomePagerAdapter(SupportFragmentManager fm)
{
super(fm);
}
答案 3 :(得分:0)
当您开始交易而不是suuportfragmanager时,将其更改为childfragmentmanager