ViewPager的片段数量应该是

时间:2017-01-24 01:19:15

标签: android android-fragments android-viewpager android-tablayout

有人可以帮助我理解为什么下面的一些代码可以在一个片段上工作但不能在另一个片段上工作,这使得我最终得到的内部片段数量是我应该拥有的两倍,并使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:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@android:color/white"
    tools:context=".activities.companies.MyFragment">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        app:tabMode="fixed"
        android:background="@color/color_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top" />

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_below="@id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

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

更新

好的,发现它,我有一些来自MainActivity的剩余代码,其中片段正在实例化,并且我添加了包含ViewPager的相同片段。

不太确定为什么它表现得像这样,因为两个ViewPage都在不同的地方并且有不同的名称,但是,这仍然是造成奇怪情况的原因。

当两个实例在技术上不同并且不应该相互影响时,有没有人知道为什么会发生这种情况的答案?

或者我错过了什么?

无论哪种方式,我都感谢大家提出的想法,让我重新审视所有使用过的片段的所有内容,如果不是这样,我可能会在这个混乱循环中迷失多少时间。

3 个答案:

答案 0 :(得分:1)

我怀疑在适配器的构造函数中初始化片段的方式以及使用FragmentStatePagerAdapter的方式会发生一些变化。

尝试使用FragmentPagerAdapter,这样您的片段就不会在后台销毁,也可以尝试使用

设置tabLayout
tabLayout.setupWithViewpager(viewPager);

答案 1 :(得分:1)

阅读ViewPager的文档后。您的ViewPager不会生成两倍的页面。对于getItem返回的每个实例,都会调用onCreateView一次

答案 2 :(得分:0)

好的,发现它,我有一些来自MainActivity的剩余代码,其中片段正在实例化,并且我添加了包含ViewPager的相同片段。

不太确定为什么它的行为是这样的,因为两个ViewPage都在不同的地方并且有不同的名称,但是,这仍然是造成奇怪情况的原因。

我感谢大家的想法让我重新审视了所有使用过的片段的所有内容,没有这些我可能会在这个混乱循环中迷失多少时间。