我试图实现一个布局,显示一个视图寻呼机时,设备是纵向显示和显示两个窗格时,设备是横向。
所以我做了两个不同的布局文件,一个只有一个ViewPager,另一个有一个LinearLayout,另一个有两个FrameLayouts,我认为没有必要在这里显示它们。这两个配置还有一个布尔值hasTwoPanes
。
@Inject FragmentOne fragmentOne;
@Inject FragmentTwo fragmentTwo;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
boolean hasTwoPanes = getResources().getBoolean(R.bool.hasTwoPanes);
TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager viewPager = findViewById(R.id.view_pager);
if (hasTwoPanes) {
tabLayout.setVisibility(View.GONE);
} else {
tabLayout.setVisibility(View.VISIBLE);
tabLayout.setupWithViewPager(viewPager);
viewPager.setAdapter(new MyPagerAdapter(fm));
}
FragmentOne frag1 = (FragmentOne) fm.findFragmentByTag(getFragmentName(0));
if (frag1 != null) fragmentOne = frag1;
FragmentTwo frag2 = (FragmentTwo) fm.findFragmentByTag(getFragmentName(1));
if (frag2 != null) fragmentTwo = frag2;
if (hasTwoPanes) {
if (frag1 != null) {
fm.beginTransaction().remove(fragmentOne).commit();
fm.beginTransaction().remove(fragmentTwo).commit();
fm.executePendingTransactions();
}
fm.beginTransaction().add(R.id.frame_frag1, fragmentOne, getFragmentName(0)).commit();
fm.beginTransaction().add(R.id.frame_frag2, fragmentTwo, getFragmentName(1)).commit();
}
}
private class MyPagerAdapter extends FragmentPagerAdapter {
MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return fragmentOne;
} else {
return fragmentTwo;
}
}
@Override
public int getCount() {
return 2;
}
}
private static String getFragmentName(int pos) {
return "android:switcher:" + R.id.view_pager + ":" + pos;
}
字符串
使用Dagger插入两个片段。如果没有片段已经存在,则根据方向将这些插入的片段添加到视图页或布局中。
因为视图分页适配器为其片段命名,所以我需要知道该名称(因此是getFragmentName(int pos)
方法)才能在旋转后取回该片段。
结果是,从纵向旋转到横向时,状态正确恢复,但从横向旋转到纵向时,视图页面完全为空。当我旋转回横向时,碎片再次出现。选项卡布局也有问题,没有滑动动画,我可以连续地从一个选项卡滑动到另一个选项卡,停在任何地方。
为了说明这一点,请注意,这是在“活动”中发生的,没有父片段。即使未显示片段,也会调用片段的onViewCreated
。视图分页器似乎可以正确还原instantiateItem
中的片段引用。此外,调试时,片段将added
设置为true,将hidden
设置为false。这使它看起来像是视图分页器呈现问题。
- 如何使视图页面导航器显示片段?
- 有没有更好的方法来实现我想要的行为?
4条答案
按热度按时间vs91vp4v1#
你有没有试过使用PagerAdapter而不是FragmentPagerAdapter?你会更好地控制片段的创建和处理。否则你不知道FragmentPagerAdapter在做什么(他为你做了,但可能是错的)。
您可以将大部分逻辑移动到该类中,使活动更清晰,并且可能还修复了您遇到的问题。
编辑:由于我们在这里讨论的是方向更改,您可能应该合并
onConfigurationChanged
回调以更好地处理该逻辑。brtdzjyr2#
我找到的解决方案非常简单,在我的寻呼机适配器中覆盖
getPageWidth
,如下所示:字符串
R.bool.hasTwoPanes
是默认配置和values-land
中可用的布尔资源。我的布局在两种配置中是相同的,标签布局只是隐藏在横向上。片段恢复由视图页导航自动完成。
tsm1rwdh3#
试试这个
Portrait Xml:
字符串
Landscape Xml:
型
活动Java:
型
brjng4g34#
ViewPager2纵向和横向模式配置更改处理
如果您在配置更改期间遇到
ViewPager2
问题,特别是在纵向和横向模式之间转换时,您可以实现以下解决方案。字符串
确保您已在Manifest文件中添加了这一行:
android:configChanges="orientation|screenSize"
型