MaTTo
MaTTo

Reputation: 2396

Fragment with SlidingTabLayout

I've got an app with left navigation drawer, switching between different fragments. Inside one of those fragment I want to implement SlidingTabLayout.

So, what I did is I copied the SlidingTabLayout.java and SlidingTabStrip.java from Google's iosched app. I used them inside my fragment:

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

And then in my Fragment class, inside onCreateView method, I instantiated my pager and SlidingTabLayout like this:

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);

And this is my 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];
        }
    }

Also I got separate Fragment class and layout for each tab, which is nothing special. And it works, but as soon as I switch to other fragment with my navigation drawer, when I get back, content of one of tabs just dissapears. Mostly it happens to second tab. Also, if I select the HomeFragment from navigation drawer, when is already displayed, I get a nullpointerexception inside SlidingTabLayout.java at this line: mViewPager.setCurrentItem(i);

Any way of fixing it? I have no idea what to do. I guess my code would work, but inside activity. Possible to make it work inside fragment?

Upvotes: 0

Views: 1417

Answers (4)

zerocool
zerocool

Reputation: 192

When you begin transaction instead of suuportfragmanager change it to childfragmentmanager

Upvotes: 0

Vyshnavi
Vyshnavi

Reputation: 338

I also faced the same issue. Please use FragmentStatePagerAdapter instead of FragmentPagerAdapter which will solve this issue.

Upvotes: 1

Xcihnegn
Xcihnegn

Reputation: 11597

Can you try to change constructor of HomePagerAdapter to:

public HomePagerAdapter(SupportFragmentManager fm)
{
    super(fm);
}

Upvotes: 0

MaTTo
MaTTo

Reputation: 2396

Solution:

What I did is instead of implementing FragmentPagerAdapter, I implemented PagerAdapter then I overriden the instantiateItem(ViewGroup container, int position) method and destroyItem() method.

Link, that helped me: http://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.slidingtabsbasic/SlidingTabsBasicFragment.html

Upvotes: 0

Related Questions