如何在按钮点击时清除片段堆栈和活动堆栈

4
有类似的问题,但是没有一个解决我的问题。 我的应用程序流程如下: 主页 Activity 启动 Activity B(负责设置工作) 在 Activity B 中作为片段托管了三个屏幕... Fragment1 -> Fragment2 -> Fragment3。
这就是我创建片段的方式。我没有使用 replace,而是添加它们。
FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        Fragment fragment = null;
        if (getFragType().equals("simple")) {
            fragment = new SimpleFragment().newInstance();
        }
        if (getFragType.equals("inter")) {
            if (getFragType.getComponent().equals("con"))
                fragment = new SetupConFragment().newInstance();
            else if (getFragType.getComponent().equals("ben"))
                fragment = new SetupBenageFragment().newInstance();
        }
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
        }

Fragment3有一个完成按钮。因此,一旦从第三个片段完成了所有三个步骤,我将启动一个新的C活动。

问题是:-- 从活动C中,如果用户按下返回按钮,它会显示片段2,然后是片段1。理想情况下,一旦用户进入C活动,返回操作应该只退出屏幕 我使用了所有意图标志的组合,但这并没有帮助。

这是我的按钮点击事件。

Intent launch = new Intent(mContext, MainActivity.class);
                    launch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    launch.putExtra("Exit me", true);
                    mContext.startActivity(launch);
                    ((ConfigureActivity)mContext).finish();

非常感谢您的帮助。


在Activity B上调用finish()应该将其从返回堆栈中移除。如果用户在Activity C中按下返回按钮,焦点应该去哪里? - Jacob Phillips
ConfigureActivity是我的B活动,理想情况下应该可以。但似乎有些地方出了问题。清除回溯不起作用(Intent.FLAG_ACTIVITY_CLEAR_TOP)。 - uff simon
3个回答

7
您可以这样做:
清除片段栈:
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

清空活动栈:

Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

希望这能对你有所帮助。

非常感谢你,Hiren,它起作用了 :-) 奇怪的是,我在两个不同的语句中都使用了相同的选项,但它却没有起作用,但是管道符号起作用了。我只是使用了 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) ,所有相关的片段任务都被清除了...投票并接受答案。 - uff simon
@Simon 很高兴能帮助你。 - Hiren Patel

2

假设您想在Activity A中启动Activity B,但不希望用户返回到Activity A,则可以实现以下操作:

final Intent intent = new Intent(this, ActivityB.class);
startActivity();
finish(); // kill the current activity (i.e., Activity A) so user cannot go back

我认为你没有完整地看我的帖子,这就是我正在做的事情...我的问题是清除堆栈。 - uff simon

0
在您的 Activity C 中,您可以通过重写 onBackPressed() 方法来控制返回键。
@Override
public void onBackPressed()
{
     // code here depending on your needs
}

是的,但这并没有解决这个问题。我可以简单地忽略super.onBackPressed(),但我想要删除整个片段堆栈。 - uff simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接