简体   繁体   中英

TabLayout fragments are instantiated as the same when debugger is not connected

I have a TabLayout that uses a custom adaptor (TabPagerAdapter.java), it's initialised with this function (I previously had the problem that things didn't update when replaced so it removes everything before initializing):

public boolean setPagerViewContents(int mode, ArrayList<String> titles) {
    try {
        mTabLayout.removeAllTabs();
        mViewPager.setAdapter(null);
        mViewPager.removeAllViews();
        for (int i = 0; i < titles.size(); i++) {
            mTabLayout.addTab(mTabLayout.newTab().setText(titles.get(i)));
        }

        mAdapter = new TabPagerAdapter(getSupportFragmentManager(), titles.size(), mode);
        mViewPager.setAdapter(mAdapter);
        mViewPager.invalidate();
        return true;
    } catch (Exception e) {
        mErrorReporter.reportError(e);
        return false;
    }
}

Custom adapter (TabPageAdapter.java):

public class TabPagerAdapter extends FragmentStatePagerAdapter {

    int mTabCount;
    int mLayoutType;

    public TabPagerAdapter(FragmentManager fm, int numberOfTabs, int layoutType) {
        super(fm);
        this.mTabCount = numberOfTabs;
        this.mLayoutType = layoutType;
    }

    @Override
    public Fragment getItem(int position) {
        switch (mLayoutType) {
            case 0:
                switch (position) {
                    case 0:
                        return new Fragment15();
                    case 1:
                        return new Fragment1();
                    default:
                        return null;
                }
            case 1:
                switch (position) {
                    case 0:
                        return new Fragment3();
                    case 1:
                        return new Fragment2();
                    default:
                        return null;
                }
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mTabCount;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

When the app starts the function setPagerViewContents (with the right mode and titles) is called, after that mViewPager.setCurrentItem(number) is called to display the right tab. But now the fragment displayed in mViewPager is correct but when clicking on a tab title the fragment is the same displayed at start (the one with the index number , not the one that should have been displayed), when tapping the first ( number ) tab again and then again to some other tab (not number ) the shown tab is correct.

The most annoying thing here is that it's NOT consistent, it sometimes happens, sometimes doesn't and it doesn't happen when the debugger is attached so I can't debug it properly. If some other code is needed please do tell, I'll update this post as quick as possible because I'd really love to see this solved, for my own sanity and for the happiness of my few users.

Change your following method:

public boolean setPagerViewContents(int mode, ArrayList<String> titles) {
        try {
            mAdapter = new TabPagerAdapter(getSupportFragmentManager(), titles.size(), mode);
            mViewPager.setAdapter(mAdapter);
            mTabLayout.setupWithViewPager(mViewPager);
            return true;
        } catch (Exception e) {
            mErrorReporter.reportError(e);
            return false;
        }
    }

and set text on tabs in TabPagerAdapter by overriding following method:

@Override
    public CharSequence getPageTitle(int position) {
        return context.getString(tabTitles[position]);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM