以编程方式返回到Backstack中的上一个片段

Ask*_* B. 203 android android-fragments back-stack

假设我有一个以编程方式添加了片段的活动:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}
Run Code Online (Sandbox Code Playgroud)

返回到可见的上一个片段的最佳方法是什么?

在Android按钮点击时发现了Trigger后退按钮功能,但我认为模拟后退键事件不是正确的方法(我也无法让它工作):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
Run Code Online (Sandbox Code Playgroud)

打电话finish()只关闭我不感兴趣的活动.

有没有更好的方法来解决这个问题?

stu*_*ess 339

看看getFragmentManager().popBackStack()方法(有几种可供选择)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

  • `getFragmentManager().popBackStackImmediate();`做了诀窍.谢谢. (87认同)
  • 不要忘记在代码中添加"addToBackStack("tag")"."fragmentManager.beginTransaction()代替(R.id.content_frame,片段).addToBackStack(" 标签 ")提交();".如果你编写addToBackStack(null),它将自己处理它,但如果你给一个标记,你应该手动处理它. (5认同)
  • 没有看到代码,很难说......但它应该进入当您想要“关闭”当前片段并返回到上一个片段时执行的代码部分。 (2认同)
  • getSupportFragmentManager() 怎么样 (2认同)
  • 在此之前,我们应该使用命令"addToBackStack()"吗? (2认同)

Kyl*_*ner 124

要详细说明提供的其他答案,这是我的解决方案(放在一个活动中):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么会这样呢?在片段示例http://developer.android.com/training/basics/fragments/index.html中,它们不会覆盖onbackpressed事件,但它们能够反向堆叠片段.我用过trasaction.addToBackStack(null); 但没有任何反应.你能解释一下原因吗? (5认同)
  • Android已经为你做了这样的事情:_"当后端堆栈上有FragmentTransaction对象并且用户按下后退按钮时,FragmentManager会从后端堆栈中弹出最近的事务并执行相反的操作(例如,如果交易添加了它.)"_ [(来源)](https://developer.android.com/training/implementing-navigation/temporal.html) (3认同)
  • 在我的情况下,我必须执行`fm.getBackStackEntryCount()> 1`,以便在堆栈中只有第一个片段时调用活动. (2认同)

Jab*_*eer 26

当我们更新/添加片段时,

应包括.addToBackStack().

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();
Run Code Online (Sandbox Code Playgroud)

之后,如果我们getFragments.popBackStackImmediate()添加/更新片段,并且返回当前屏幕,我们将返回true.


Yog*_*til 15

Android 导航架构组件。

以下代码对我有用:

findNavController().popBackStack()
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用 navController,我认为您必须使用此方法 - 我首先尝试了片段管理器(上面的答案),然后在尝试使用 navController 进行导航时发生了崩溃。 (2认同)

Bip*_*Das 11

如果我没有将 addToBackStack() 添加到我的片段事务中,这些答案不起作用,但是,您可以使用:

getActivity().onBackPressed();
Run Code Online (Sandbox Code Playgroud)

从你的任何片段往回走一步;

  • Kotlin 的“requireActivity().onBackPressed()” (3认同)

Avi*_*was 8

将这些行添加到onBackPressed()方法中.如果你在后台堆栈上有任何片段,popBackStackImmediate()方法会让你回到上一个片段

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

`


Gie*_*kas 5

当您想在主片段中回按时关闭应用程序时,此解决方案非常适合基于底部栏的片段导航。

另一方面,当您打开在我的代码中定义为“DetailedPizza”的次要片段(片段中的片段)时,它将返回主要片段的先前状态。干杯!

背面的内部活动按下了这个:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}
Run Code Online (Sandbox Code Playgroud)

并像这样启动另一个片段:

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
Run Code Online (Sandbox Code Playgroud)


can*_*ler 5

科特林答案

  1. 首先,调用Fragment Manager
  2. 之后,使用onBackPressed() 方法。

使用 Kotlin 在 Android Studio 4.0 中进行编码:

fragmentManager?.popBackStack()
Run Code Online (Sandbox Code Playgroud)