在 Activity App Bar 上按下后转到带有它被调用的片段的父 Activity

Posted

技术标签:

【中文标题】在 Activity App Bar 上按下后转到带有它被调用的片段的父 Activity【英文标题】:On Activity App Bar back pressed go to the parent activity with the fragment it was called 【发布时间】:2021-08-26 11:32:47 【问题描述】:

我遇到了其他社区成员可能遇到的问题,我想问问是否有人知道解决方案。我有一个包含这两个活动(MainActivity、UserProfileActivity)的应用程序。

MainActivity 包含一个在片段中导航的 NavigationDrawer。所以这就是问题所在。在第二个片段中导航并按下该片段中的按钮时。它打开 UserProfileActivity(MainActivity 的子项),其中包含作为子项生成的应用栏。当你按下这个新 Activity 的返回按钮时,它应该回到我们调用这个新 Activity 时所在的片段中的 MainActivity(父级)。但不是,它返回到 MainActivity 但加载了 home 片段。不是我们之前调用的那个。

有人知道如何解决这个问题吗?在这里,我留下了我从片段中所做的意图的代码:

Intent intent = new Intent(context, UserProfileActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("userId", message.getUserId());
            intent.putExtras(bundle);
            context.startActivity(intent);

【问题讨论】:

更改片段时是否将第二个片段添加到后台堆栈? 【参考方案1】:

这种行为背后的原因:

如果您在 manifest.xml 中设置 android:parentActivityName 的值,默认情况下,每次按下导航按钮都会创建父活动的新实例,而不是将其从活动后台堆栈中弹出,因此您会看到主页片段。

解决方法

首先,从 manifest.xml 中删除 android:parentActivityName。在您的 ChildActivity 的 onCreate 方法中,如果您还没有,请输入 getSupportActionBar().setDisplayHomeAsUpEnabled(true)。然后覆盖您 ChildActivity 的onSupportNavigateUp(),并放入finish()

ChildActivity.java:

public class ChildActivity extends AppCompatActivity 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        ...
        getSupportActionBar().setDisplayHomeAsUpEnabled(true)
        ...
    

    @Override
    public boolean onSupportNavigateUp() 
        finish();
        return super().onSupportNavigateUp();
    

【讨论】:

它工作正常,这是以编程方式解决的问题吗? 不,这不是Activities的实际父子关系方式。这样,当您直接从应用程序外部的任何位置(例如,从通知、主屏幕小部件等)启动 ChildActivity 时,按下后退按钮将退出您的应用程序,而不是导航到 ParentActivity。因此,如果您不需要从外部启动它并导航回 ParentActivity,那么它就可以正常工作。

以上是关于在 Activity App Bar 上按下后转到带有它被调用的片段的父 Activity的主要内容,如果未能解决你的问题,请参考以下文章

离子标签不会转到下一页

按下后如何将数据从第二个活动传递到第一个活动? - 安卓

替换两个不同的片段后,按下后​​退按钮时会重新创建第一个片段

使文本转到新文本

如果在对话框上按下按钮,如何启动活动

如何在按钮按下时转到 tableView 的顶部