Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有两倍于应有片段数的ViewPager_Android_Android Fragments_Android Viewpager_Android Tablayout - Fatal编程技术网

Android 具有两倍于应有片段数的ViewPager

Android 具有两倍于应有片段数的ViewPager,android,android-fragments,android-viewpager,android-tablayout,Android,Android Fragments,Android Viewpager,Android Tablayout,有人能帮我理解为什么下面的代码在一个片段上有效,而在另一个片段上无效,使我最终得到两倍于我应有的内部片段,并使TabLayout和ViewPager失去同步: 片段: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mainView = inflater

有人能帮我理解为什么下面的代码在一个片段上有效,而在另一个片段上无效,使我最终得到两倍于我应有的内部片段,并使TabLayout和ViewPager失去同步:

片段:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    mainView = inflater.inflate(R.layout.fragment_companies_ranking, container, false);

    pagerAdapter = new MyPagerAdapter(getFragmentManager());

    tabLayout = (TabLayout)mainView.findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("1");
    tabLayout.addTab(tabLayout.newTab().setText("2"));
    tabLayout.addTab(tabLayout.newTab().setText("3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    viewPager = (ViewPager)mainView.findViewById(R.id.pager);
    viewPager.setAdapter(pagerAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    viewPager.requestFocus();

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    return mainView;
}
Xml:


PagerAdapter:

public class MyPageAdapter extends FragmentStatePagerAdapter {

    private ArrayList<Fragment> fragments = new ArrayList<>(2);

    public MyPageAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);

        fragments.clear();
        fragments.add(OneFragment.newInstance());
        fragments.add(TwoFragment.newInstance());
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
}
公共类MyPageAdapter扩展了FragmentStatePagerAdapter{
私有ArrayList片段=新ArrayList(2);
公共MyPageAdapter(碎片管理器碎片管理器){
超级(碎片管理器);
片段。清除();
add(OneFragment.newInstance());
add(TwoFragment.newInstance());
}
@凌驾
public int getCount(){
返回fragments.size();
}
@凌驾
公共片段getItem(int位置){
返回碎片。获取(位置);
}
}
更新:


好的,找到了,我有一些MainActivity中的遗留代码,片段在那里被实例化,我在那里添加了包含ViewPager的片段

不太清楚它为什么会这样,因为两个viewpager都位于不同的位置,并且有不同的名称,但是,这就是造成这种奇怪情况的原因

有人知道为什么这两种情况在技术上是不同的,并且不应该相互影响时会发生吗

还是我遗漏了什么


不管怎样,我都要感谢大家的想法,这些想法让我重新审视了所有使用过的碎片,否则,我可能会在这个混乱循环中迷失最多几个小时。

我怀疑在适配器的构造函数中初始化片段的方式和使用FragmentStatePagerAdapter的方式有问题

试着使用FragmentPagerAdapter,这样你的片段就不会在后台被破坏,也可以试着用

tabLayout.setupWithViewpager(viewPager);

我怀疑在适配器的构造函数中初始化片段的方式以及使用FragmentStatePagerAdapter的方式有问题

试着使用FragmentPagerAdapter,这样你的片段就不会在后台被破坏,也可以试着用

tabLayout.setupWithViewpager(viewPager);

在阅读了的文档之后。您的ViewPager无法生成两倍的页面。在阅读了的文档之后,对于getItem返回的每个实例,都会调用onCreateView一次。您的ViewPager无法生成两倍的页面。一旦对getItem返回的每个实例调用一次CreateView,找到它,我从MainActivity中得到了一些剩余的代码,片段在那里被实例化,我在那里添加了与ViewPager完全相同的片段

不太清楚它为什么会这样,因为两个viewpager都位于不同的位置,并且有不同的名称,但是,这就是造成这种奇怪情况的原因


我感谢大家的想法,这些想法让我重新审视了所有使用过的碎片,否则我可能会在这个混乱循环中迷失最多几个小时。

好的,找到了,我有一些MainActivity中的遗留代码,其中片段被实例化,在那里我添加了与ViewPager完全相同的片段

不太清楚它为什么会这样,因为两个viewpager都位于不同的位置,并且有不同的名称,但是,这就是造成这种奇怪情况的原因

我感谢大家的想法,这些想法让我重新审视了所有使用过的片段,否则我可能会在这个混乱循环中迷失最多几个小时