ViewPager 的片段数量是它应该有的两倍
ViewPager with twice as many fragments as it should have
有人能帮我理解为什么以下代码对一个 Fragment 有效但对另一个无效,这让我最终得到的内部片段数量是我应该拥有的两倍,并使 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>
寻呼机适配器:
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 的完全相同的片段。
不太清楚为什么会这样,因为两个 ViewPagers 都在不同的地方并且有不同的名称,但这仍然是导致奇怪情况的原因。
当两个实例在技术上不同且不应相互影响时,是否有人知道为什么会发生这种情况的答案?
还是我遗漏了什么?
无论哪种方式,我都感谢大家的想法让我重新审视所有使用过的片段,否则我最多可能会在这个混乱的循环中迷失几个小时。
我怀疑您在适配器的构造函数中初始化片段的方式以及您使用 FragmentStatePagerAdapter 的方式有问题。
尝试使用 FragmentPagerAdapter,这样您的片段就不会在后台被破坏,还可以尝试使用
设置您的 tabLayout
tabLayout.setupWithViewpager(viewPager);
阅读 ViewPager
的文档后。您的 ViewPager 不会翻倍页面。 onCreateView 为 getItem
返回的每个实例调用一次
好的,找到了,我从正在实例化片段的 MainActivity 中获得了一些剩余代码,并且在那里我添加了包含 ViewPager 的完全相同的片段。
不太确定为什么它的行为是这样的,因为两个 ViewPagers 都在不同的地方并且有不同的名称,但这仍然是导致奇怪情况的原因。
我感谢大家给我的想法,让我回顾了 re-look 所有关于所有使用过的片段的一切,否则我最多可能会在这个混乱的循环中迷失几个小时。
有人能帮我理解为什么以下代码对一个 Fragment 有效但对另一个无效,这让我最终得到的内部片段数量是我应该拥有的两倍,并使 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>
寻呼机适配器:
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 的完全相同的片段。
不太清楚为什么会这样,因为两个 ViewPagers 都在不同的地方并且有不同的名称,但这仍然是导致奇怪情况的原因。
当两个实例在技术上不同且不应相互影响时,是否有人知道为什么会发生这种情况的答案?
还是我遗漏了什么?
无论哪种方式,我都感谢大家的想法让我重新审视所有使用过的片段,否则我最多可能会在这个混乱的循环中迷失几个小时。
我怀疑您在适配器的构造函数中初始化片段的方式以及您使用 FragmentStatePagerAdapter 的方式有问题。
尝试使用 FragmentPagerAdapter,这样您的片段就不会在后台被破坏,还可以尝试使用
设置您的 tabLayouttabLayout.setupWithViewpager(viewPager);
阅读 ViewPager
的文档后。您的 ViewPager 不会翻倍页面。 onCreateView 为 getItem
好的,找到了,我从正在实例化片段的 MainActivity 中获得了一些剩余代码,并且在那里我添加了包含 ViewPager 的完全相同的片段。
不太确定为什么它的行为是这样的,因为两个 ViewPagers 都在不同的地方并且有不同的名称,但这仍然是导致奇怪情况的原因。
我感谢大家给我的想法,让我回顾了 re-look 所有关于所有使用过的片段的一切,否则我最多可能会在这个混乱的循环中迷失几个小时。