简体   繁体   English

未连接调试器时,TabLayout片段的实例化方式相同

[英]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): 我有一个使用自定义适配器(TabPagerAdapter.java)的TabLayout,它是使用此功能进行初始化的(我以前遇到的问题是,替换后事物没有更新,因此它在初始化之前会删除所有内容):

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): 定制适配器(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. 当应用程序启动时,将调用setPagerViewContents函数(具有正确的模式和标题),此后,将调用mViewPager.setCurrentItem(number)以显示右侧的选项卡。 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. 但是现在在mViewPager中显示的片段是正确的,但是当点击第一个( number )选项卡时,单击选项卡标题时,片段在开始时显示的是相同的(带有索引number的片段,而不是应该显示的片段)。一次又一次地转到其他选项卡(不是number ),显示的选项卡是正确的。

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: 并通过覆盖以下方法在TabPagerAdapter中的选项卡上设置文本:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TabLayout:切换片段时滞后 - TabLayout: Lag when switching fragments 当在TabLayout中调用其他片段时,第一个片段出现第二秒钟 - First fragment appears for a second when other fragments are called in tablayout 使用ViewPager和TabLayout切换选项卡时,片段不可见 - Fragments not visible when switch tabs using ViewPager and TabLayout 片段未显示在TabLayout内部 - Fragments are not showing inside tablayout 使用 TabLayout 和 ViewPager 的片段 - Fragments with TabLayout and ViewPager TabLayout中的滑动选项卡上的片段未刷新 - Fragments not refreshing on swiping tabs in TabLayout 在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段 - Update multiple fragments with same layout after doing Async Task in TabLayout and ViewPager2 从第二个Fragment的recyclerView中选择项目时如何切换到第一个Fragment? 两个片段都在带有 viewPager2 的 tablayout 中 - How to switch to the first fragment when selecting an item from the recyclerView of second Fragment? Both fragments are in tablayout with viewPager2 调试器未连接时jvmti的性能影响? - performance impact of jvmti when debugger isn't connected? 在TabLayout Android Studio的2个片段之间传输数据 - transfer data between 2 fragments of a TabLayout Android Studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM