gpt4 book ai didi

android - 纵向上的 Viewpager 和横向上的两个 Pane

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:03 25 4
gpt4 key购买 nike

我正在尝试实现一种布局,当设备纵向显示时显示一个 View 寻呼机,当设备横向显示时显示两个 Pane 。

所以我做了两个不同的布局文件,一个只有一个ViewPager,一个有一个LinearLayout,一个有两个FrameLayout,我觉得没必要在这里展示。这两个配置还有一个 bool 值 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;
}

两个 fragment 用 Dagger 注入(inject)。如果不存在任何 fragment ,这些注入(inject)的 fragment 将根据方向添加到 View 寻呼机或布局中。

因为 View 寻呼机适配器为其 fragment 提供了名称,所以我需要知道该名称(因此使用 getFragmentName(int pos) 方法)才能在旋转后取回该 fragment 。

结果是从纵向旋转到横向时状态正确恢复,但是当从横向旋转到纵向时, View 寻呼机完全是空的。当我旋转回横向时, fragment 重新出现。选项卡布局也有问题,没有滑动动画,我只能从一个选项卡连续滑动到另一个选项卡,停在任何地方。

澄清一下,这是在 Activity 中发生的,没有父 fragment 。即使未显示 fragment ,也会调用 fragment 的 onViewCreated。 View 寻呼机似乎正确地恢复了 instantiateItem 中的 fragment 引用。此外,在调试时, fragment 将 added 设置为 true,将 hidden 设置为 false。这让它看起来像是一个 View 寻呼机渲染问题。

  • 如何让 View 寻呼机显示我的 fragment ?
  • 是否有更好的方法来实现我想要的行为?

最佳答案

您是否尝试过使用 PagerAdapter 而不是 FragmentPagerAdapter?您将更好地控制 fragment 的创建和处理。否则你不知道 FragmentPagerAdapter 在做什么(他在为你做,但可能是错的)。

您可以将大部分逻辑转移到该类中,使 Activity 更清晰,并且可能还解决了您遇到的问题。

编辑:由于我们在这里讨论方向更改,您可能应该合并 onConfigurationChanged 回调以更好地处理该逻辑。

关于android - 纵向上的 Viewpager 和横向上的两个 Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50557650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com