【发布时间】:2023-03-22 08:26:01
【问题描述】:
我有一个页面查看器,API 21 上发生了一些非常奇怪的事情(它适用于 API 17)。
在查看器的第一页上,有一个链接可以加载第二页并替换其中的片段。我第一次单击链接并加载第二页它工作正常,但如果我在加载第三页后单击链接,片段替换不起作用,我最终得到第二个屏幕,其中没有片段.
下面是设置第二页的简化版代码:
ScreenSlidePagerAdapter adapter = (ScreenSlidePagerAdapter) sPager.getAdapter();
// Set second page in the viewer
if (adapter.getCount() != 2) {
adapter.setCount(2);
adapter.notifyDataSetChanged();
}
SecondPageFragment frag2 = new SecondPageFragment();
sFragmentManager.beginTransaction().replace(R.id.container_page2, frag2, “Frag2TAG”).commit();
sPager.setCurrentItem(1);
与 API 17 相比,为什么 API 21 上的替换工作方式不同?以前有人遇到过类似的问题吗?这似乎是相关的,但没有解决方案:fragments-transaction-replace-on-api-21-is-staying-behind
编辑:SecondPageFragment 的代码只是一个片段:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved_instance_state) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_page2, container, false);
return rootView;
}
这是布局fragment_page2:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/container_page2">
【问题讨论】:
-
显示 sFragmentManager 声明的代码。是否使用 getSupportFragmentManager()?
-
您好,感谢您的回复。是的,它正在使用
getSupportFragmentManager(); -
关于您在帖子中列出的链接的有趣之处,发布的答案也有我的用户名 :-)
-
我试图理解...所以你正在执行一个事务来加载一个由 FragmentPagerAdapter 提供的片段?我假设您的适配器是 FragmentPagerAdapter 子类。 FragmentPagerAdapter 进行所有自己的事务管理,因此执行您自己的事务会打破它的假设,并且您可以获得粗略的行为。希望我能看到更多你的代码......我已经用 ViewPager 做了很多工作,甚至在 FragmentPagerAdapter 不能给我想要的东西时为片段编写了一个自定义 PagerAdapter,所以我想我可以帮到你...
-
@TheOriginalAndroid :这很有趣。我看到你一直在这里帮助人们已经有一段时间了。惊人的! @kris larson:感谢您的回复。你是对的,我使用的是
class ScreenSlidePagerAdapter extends FragmentPagerAdapter。 AdaptergetItem(int position)只为第二页返回一个新的 Page2TransitionFragment()。 Page2TransitionFragment 有一个 Layout (R.id.container_page2) 我用另一个 Fragment 替换,这取决于在第 1 页上单击的内容。我将尝试而不是替换 Layout 来执行 AdaptergetItem方法中的逻辑。跨度>
标签: android android-fragments android-viewpager