通过侧边菜单移动到其他模块时如何完成所有活动

Posted

技术标签:

【中文标题】通过侧边菜单移动到其他模块时如何完成所有活动【英文标题】:How to finish all activity when move to other modul via sidemenu 【发布时间】:2017-07-07 05:26:23 【问题描述】:

我会解释我的问题:

我有 4 个主菜单可以从仪表板页面访问,例如:

菜单 A 菜单 B 菜单 C 菜单 D

每个菜单里面都有子菜单,所以菜单树看起来像(ALL Menu是一个独立的Activity):

菜单 A -> SubA-1 -> SubA-2 菜单 B -> SubB-1 -> SubB-2 菜单 C -> SubC-1 -> SubC-2 菜单 D -> SubD-1 -> SubD-2

当我访问菜单 A 到 SubA-1 然后是 SubA-2。所以现在我在 SubA-2 里面。 我从 SubA-2 转到菜单 B。

从菜单 B 我访问 SubB-1。所以现在我在 SubB-1 里面。当我按下后退按钮时,我将像这样移动序列: SubB-1 -> 菜单 B -> SubA-2 -> SubA-1 -> 菜单 A

如何避免在按下后退按钮时仍然调用 Menu A Activity(但不建议阻止后退按钮)?我使用它但不能完美地工作:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

如果您需要有关案例的更多信息,可以在下面发表评论。

更新:

如果用户来自 MenuB,则不允许他们返回 menuA。但他们仍然 如果它们来自 subA-1(菜单 A 的子菜单),则返回菜单 A。

谢谢。

【问题讨论】:

你尝试过覆盖onBackPressed() 我已经尝试过 onBackPressed() 和工作(我使用意图调用新的仪表板活动)。是好方法吗?我知道实例新活动成本很昂贵。我错了吗? @Patrick 是的,没关系,这样做并在返回仪表板时清除后台堆栈,我建议对子菜单使用片段,仪表板将只是活动。检查我的答案 【参考方案1】:

试试这个需要 API 级别 >= 11。

Intent i = new Intent(OldActivity.this, NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

【讨论】:

仪表板页面怎么样?它也会关闭吗?因为我希望我的仪表板仍然处于活动状态。【参考方案2】:

发生这种情况的原因是因为android Activity 有一个默认功能,当您意图而不指定意图类型时,默认情况下会将活动放在后台堆栈中。为了避免您只需像这样清除 startActivity 上的第一个以外的 backstack

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

但是我认为当你在做一个子菜单类型的应用程序时,最好使用片段而不是活动。

【讨论】:

【参考方案3】:

您可以完成不希望用户返回的菜单 A 活动。例如,在您的 Menu A 活动中,在您调用 startActivity 之后,立即调用 finish()。当用户点击后退按钮时,他们将无法进入 Menu A 活动,因为它已从堆栈中删除。

【讨论】:

不太像那样。如果用户返回 SubA-1,如果用户返回菜单 A,我没有问题。如果他们从菜单 B 移动到菜单 A 或 A 的子菜单,则不允许这样做。【参考方案4】:

试试这个:

Intent i=new Intent(getApplicationContext(), MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
    finishAffinity();
    return;

finish();

【讨论】:

【参考方案5】:

当你要去A -> SubA-1时,你必须像这样设置标志

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

因此它不会将您的活动添加到您的堆栈中。

当你要去 SubA-2 -> B 你必须设置标志FLAG_ACTIVITY_NO_HISTORY

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

在您的 B 活动 onbackpress 中将简单意图设置为仪表板活动

@Override
public void onBackPressed() 
    super.onBackPressed();
    startActivity(new Intent(this, DashboardActivity.class));

【讨论】:

仪表板页面怎么样?它也会关闭吗?因为我希望我的仪表板仍然处于活动状态。 不,只要您不从其他活动中打开它,它就不会影响您的仪表板。 如果我从 SUBA-1 按下回来怎么样?我会去菜单 A 吗? 不,它会转到仪表板活动,因为我们从堆栈中清除了 menuA。

以上是关于通过侧边菜单移动到其他模块时如何完成所有活动的主要内容,如果未能解决你的问题,请参考以下文章

如何在wordpress类别侧边栏菜单中显示活动子菜单

使用单击侧边栏导航菜单项调用活动

单击其他位置时关闭侧边菜单

使侧边菜单滑过代号一中的表单

移动端的离子底部标签和桌面端的侧边菜单

引导侧边栏导航菜单滚动到活动面板标题的顶部