当前位置: 首页 > 知识库问答 >
问题:

后退按钮前面没有显示后退堆栈片段

钮兴安
2023-03-14

在写这个之前,我已经经历了很多stackoverflow问题。我对这个家伙的碎片背栈很困惑。

我在一个活动中的同一个容器上添加了三个片段

private void addLandingFragment() {
        landingPageFragment = LandingPageFragment.newInstance();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add( R.id.container, landingPageFragment, LANDING_PAGE_FRAGMENT_TAG );
        transaction.commit();

    }
public void addIntrofragment() {
    fragment2 = IntroFragment.newInstance();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace( R.id.container, fragment2, INTRO_PAGE_FRAGMENT_TAG);
    transaction.addToBackStack(fragment2.getClass().getName() );
    transaction.commit();
}
public void onGetStartedClicked() {
        fragment3= ConnectFragment.newInstance();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace( R.id.container, fragment3,CONNECT_PAGE_FRAGMENT_TAG );
        transaction.commit();
    }

现在我想要的是,当用户按下片段3上的后退按钮时,它应该出现在第一个片段上,所以我已经覆盖了onBackPressed()方法。

@Override
    public void onBackPressed() {
        manager.popBackStack(fragment2.getClass().getName() ,FragmentManager.POP_BACK_STACK_INCLUSIVE );

    }

但屏幕上什么也没发生,它让片段3继续运行。

更新

任何实现这一点的解决方案

共有1个答案

微生昌胤
2023-03-14

调用replace()将删除前一个片段,片段1应使用replace()调用,片段2和3应使用add()调用,还应将最后一个事务添加到回栈(调用片段3)

像这样:

片段1:

private void addLandingFragment() {
    landingPageFragment = LandingPageFragment.newInstance();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace( R.id.container, landingPageFragment, LANDING_PAGE_FRAGMENT_TAG );
    transaction.commit();

}
public void addIntrofragment() {
fragment2 = IntroFragment.newInstance();
FragmentTransaction transaction = manager.beginTransaction();
transaction .hide(LandingPageFragment.this);
transaction.add( R.id.container, fragment2, INTRO_PAGE_FRAGMENT_TAG);
transaction.addToBackStack(fragment2.getClass().getName() );
transaction.commit();
public void onGetStartedClicked() {
    fragment3= ConnectFragment.newInstance();
    FragmentTransaction transaction = manager.beginTransaction();
    fragmentManager.popBackStackImmediate();     // to remove fragment 2    
    transaction.add( R.id.container, fragment3,CONNECT_PAGE_FRAGMENT_TAG );
    transaction.addToBackStack(fragment3.getClass().getName() );
    transaction.commit();
}
@Override
public void onBackPressed() {
    fragmentManager.popBackStackImmediate();
    fragmentTransaction.show(LandingPageFragment.this);
}

因此,onbackpressed将始终弹出堆栈上的顶部片段(片段3),由于片段2在添加片段3之前已经弹出,所以onbackpressed将显示第一个片段。

 类似资料:
  • XML 活动 创建 已选择选项项 在getActionBar()行上获取空指针异常。setDisplayHomeAsUpEnabled(真);

  • 我正在编写一个android应用程序,使用框架布局和片段作为其组件。 我有3个片段:、、。 在社区片段中,用户按下一个按钮来创建一个任务。然后TaskFromFrament用替换FrameLayout中的社区片段。因为在那之后,我想用后退按钮返回社区片段。 在TaskFormFragment中,用户按create按钮创建任务。然后TaskFragment打开,没有添加堆栈,因为我不想在按下后退按钮

  • 我正在尝试在上显示一个以将上一页/活动移动到主页面(第一次打开)。我做不到。 我的代码。 代码在中。

  • 我试图用这段代码来显示我的个人档案活动: 当我点击Profile菜单项时,我可以看到我的ProfileActivity,但我的ActionBar上没有任何back按钮来返回我以前的活动。 那么,我如何显示一些后退按钮?我的代码是否正确以显示菜单中的活动?

  • 我开始创建一个应用程序,它使用一个活动(导航抽屉)和许多片段。但我无法使用工具栏上的“后退”按钮从片段中导航回来。硬件后退按钮工作正常。我知道我需要覆盖选项ItemSelected,捕捉android。R、 id.home,检查后堆栈中是否有内容,然后弹出它。在更改片段后,“burger”按钮变为“back arrow”,但当我单击它时,选项ItemSelected将打开NavigationDra