Android 页面查看器中不使用API 21的片段替换

Android 页面查看器中不使用API 21的片段替换,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个页面查看器,API 21上发生了一些非常奇怪的事情(它在API 17上工作) 在查看器的第一页上有一个链接,用于加载第二页并替换其中的一个片段。第一次单击链接并加载第二个页面时,它可以正常工作,但如果在加载第三个页面后单击链接,片段替换将不起作用,我将看到第二个屏幕,其中没有片段 下面是设置第二页的简化版代码: ScreenSlidePagerAdapter adapter = (ScreenSlidePagerAdapter) sPager.getAdapter(); // Set s

我有一个页面查看器,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上的工作方式有所不同?以前有人有过类似的问题吗?这似乎是相关的,但没有解决方案:

编辑: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;
}
这是布局片段第2页:

<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">


方法
getSupportFragmentManager
()引用目录android/support/v4/。。。 由于
sFragmentManager
是使用
getSupportFragmentManager
()创建的,因此您应该检查对Fragment的所有引用,并查看它们是否引用相同的support/v4目录。一种快速的方法是检查android.support.v4的导入。您还可以通过单击对片段的所有引用进行检查


另一个选项是不使用“支持”包。

对于调试,我建议使用FragmentTransaction的
addToBackStack
()。这将保存在堆栈中处于活动状态的片段的数据和状态。这将有助于代码检查,并可能由于保存状态而产生积极影响


此外,您还可以在代码
提交
()之后调用碎片管理器的
getBackStackEntryCount
()。为此,您必须分解代码
sfFragmentManager.beginTransaction().replace(R.id.container_page2,frag2,“Frag2TAG”).commit()
。但这不应该太难。

新的关联!在我看来,FragmentPagerAdapter类中似乎有一个bug。你看,那么"链接"。由于您的评论“第一次单击链接并加载第二个页面时,它工作正常…”,我认为它与
getItemId
()有关,可能必须覆盖它

就我个人而言,我在片段中使用了PagerAdapter,将来可能会使用FragmentPagerAdapter,因为它结合了这两个类,应该更容易

编辑: 您的ID
container\u page2
可能使用了正确的表单和布局文件。但是,如果要将其与replace()一起使用,则应使用相同的一致UI元素ID。否则,碎片管理器将根据容器视图ID管理碎片,这让我感到困惑

我有一个片段的布局示例。它是嵌套在线性布局中的
示例内容\u片段
,一个框架布局。 片段的示例布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/sample_main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <FrameLayout
         android:id="@+id/sample_content_fragment"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
    />
</LinearLayout>


随时通知我们。我想知道。

显示SFFragmentManager声明的代码。是否使用getSupportFragmentManager()?您好,谢谢您的回复。是的,它正在使用
getSupportFragmentManager()关于你在帖子上列出的链接的一个有趣的事情,一个帖子的答案也有我的用户名:-)我正在努力理解。。。那么您正在执行一个事务来加载FragmentPagerAdapter提供的片段?我假设您的适配器是FragmentPagerAdapter子类。FragmentPagerAdapter自行进行事务管理,因此执行您自己的事务会打破其假设,您可以获得粗略的行为。希望我能看到更多你的代码。。。我在ViewPager上做了很多工作,甚至在FragmentPagerAdapter无法满足我的需求时为片段编写了一个自定义PagerAdapter,所以我想我可以在这里帮助你…@TheOriginalAndroid:真有趣。我知道你一直在帮助这里的人,已经有一段时间了。太棒了@克里斯·拉森:谢谢你的回复。你说得对,我使用的是
类屏幕幻灯片PageAdapter扩展了FragmentPagerAdapter
。适配器
getItem(int位置)
只为第二页返回一个新的Page2TransitionFragment()。Page2TransitionFragment有一个布局(R.id.container_page2),我用另一个片段替换它,具体取决于在第1页上单击的内容。我将尝试在Adapter
getItem
方法中执行逻辑,而不是替换布局。谢谢您的回复。我仔细检查了一下,在所有片段中都使用了support.v4。我必须继续使用support.v4,因为这是ViewPager的工作原理。重写
public int getItemPosition(Object Object)
会影响行为。如果我将其设置为始终返回
位置\u NONE
,则在加载第三个页面后,我将使用片段正确创建第二个页面。然而,如果我从第三页回击,我会得到一个没有片段的第二页。这就像创建第三页重置之前创建的第二页一样。xD@Marilia,似乎您的第二页需要修复。可能是与第二个片段相关的post代码,我假设它是SecondPageFragment。另外,你引用的“如果我从第三页回击,我会得到一个没有片段的第二页”,为什么要回到第二页?您只使用了replace(),没有使用addToBackStack()。@Marilia,由于您的评论,我刚刚注意到您的UI ID,因此我在编辑部分添加了更多评论。您好!谢谢你的回复。我编辑了这篇文章,为SecondPageFragment及其布局添加了代码。这是一个我根据他们在第一页上单击的内容替换容器中的片段的页面。谢谢你的投票。:)API之间的差异可能是随着对支持的更改而引入的