从另一个活动返回到Activity-A的特定片段

4

enter image description here

我从Activity-A打开Message-Fragment,然后从Message-Fragment打开Camera-Fragment。现在当前片段是Camera-Fragment,上面有媒体滑块。现在我有两个选项,一个是如果我点击媒体滑块上的图像项将打开ImagePreview-Fragment。另一个是如果我点击媒体滑块上的视频项,且视频大小大于10 MB,则会打开VideoTrim-Activity,完成裁剪后调用VideoPreview-Activity
我从VideoPreview-ActivityImagePreview-Fragment发送媒体。因此,当我发送媒体时,我希望能够返回到带有数据的Message-Fragment
我该如何从Camera-Fragment打开的VideoPreview-Activity(或从VideoTrim-Activity打开的VideoPreview-Activity)返回到Message-Fragment?如果您能帮助我了解如何从ImagePreview-Fragment返回到Message-Fragment,我将不胜感激。这些是分开的问题。希望您能帮忙。
我通过添加到回退栈中“addToBackStack(fragmentTag)”来打开片段。
编辑:VideoPreview-Fragment必须是VideoPreview-Activity,VidoTrim-Fragment必须是VideoTrim-Activity。这些都是活动,就像您在图像上看到的那样。

在我回答之前,我可以确认几个问题吗?1.您是否希望在修剪或预览时能够点击返回按钮并返回到相机片段或始终返回到消息片段?2.当您说“返回”时,您实际上是指导航回去还是使用返回按钮,还是它实际上是旅程中的一个进展,将您带回那个点? - Gapp
是的,我能够点击。当我点击返回按钮时,我会返回到相机活动。我的意思是回到那个点,就像完成该活动或者弹出进度。同时,我需要将数据传递给消息片段。 - Farukest
最后一个快速问题是,MessageFragment是活动中的初始视图还是添加在现有视图之上? - Gapp
它被添加到现有视图之上。Activity-A 有 4 个选项卡(片段)视图。我从好友选项卡(片段)打开消息片段。 - Farukest
K,我要快速修改一下我的答案。 - Gapp
2个回答

6
如果我理解得正确,我认为我有一个解决方案。我将忽略导航的所有其他方面,只关注您想从 VideoPreviewActivity MainActivity 并调整片段堆栈的事实,并且这是由完成按钮(或类似物)触发的,但不是后退按钮。
简单的方法是使用活动结果函数 startActivityForResult ,这将允许您在主活动中使用 onActivityResult 函数将信息传递回来。但是,您可能会通过 VideoTrimActivity 导航到 VideoPreviewActivity ,因此您必须通过两个活动将此信息传递回来,这可能有点混乱。
因此,我的解决方案有几个步骤。
不要在 VideoPreviewActivity 上调用 finish(),而是触发一个意图来创建 MainActivity
Intent intent = new Intent(context, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra()//Add your return data here
startActivity(intent)

不必启动一个新的MainActivity,使用此方法可以返回到前一个活动,并结束其上方的所有活动。

将此函数添加到MainActivity中。

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
}

然后在 onStart 函数中,您可以检查您的意图,以查看是否有来自 VideoPreview 返回的数据,并删除您不再需要的片段。

if (getIntent().hasExtra(YOUR_DATA)) {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0)
            getSupportFragmentManager(). popBackStackImmediate("MESSAGE_TAG", 0);
}

其中“MESSAGE_TAG”是在ft.addToBackStack("MESSAGE_TAG")调用中使用的标签。

这将清除事务中所有具有addToBackStack的片段。 MessageFragment将重新开始其生命周期调用,您可以访问数据来自

getActivity().getIntent()

谢谢。目前它运行良好 :) 使用各种情况进行测试。 但是 getSupportFragmentManager(). popBackStackImmediate("CAMERA_TAG", 0) 没有将我返回到 MessageFragment。 我仍然看到 CameraFragment。 我尝试使用这个,它很好用。 如果我的代码有任何问题,请告诉我。 我使用这个 getSupportFragmentManager().popBackStack("CAMERA_TAG",FragmentManager.POP_BACK_STACK_INCLUSIVE); - Farukest
不,你说得对,这是我举例时出现的问题。你可以选择使用“CAMERA_TAG” INCLUSIVE或者“MESSAGE_TAG” 0。我会修正我的答案。 - Gapp
最好使用MESSAGE_TAG 0,即使您添加了不同的片段,它仍然可以正常工作。 - Gapp
然后我将使用MESSAGE_TAG 0。再次感谢您的努力。如果您将我的问题标记为有用,我将不胜感激。 - Farukest
@Gapp,我没有理解你上面实现返回到之前特定 Fragment 的方式。??? 你能再次评论一下吗?我也有同样的问题。我想回到之前的 fragment 活动,如何返回,当我启动 Intent 时,它会进入主页。 - Wade
在重写onNewIntent时,您不应该调用super.onNewIntent(intent)吗? - Zezi Reeds

1

请尝试以下内容:

首先在ActivityA中获取framelayout元素,

  <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

在ActivityA中创建方法。
 public void openFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, null).commit();
        String backStateName = fragment.getClass().getName();
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = manager.beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment, backStateName);
        fragmentTransaction.addToBackStack(backStateName);
        fragmentTransaction.commit();
    }

在您的MainActivity中完成此操作,然后覆盖该方法,如下所示:
@Override
    public void onBackPressed() {
        int count = getSupportFragmentManager().getBackStackEntryCount();
        if (count == 0) {
            if (exit) {
                finish(); // finish activity
            } else {
                Toast.makeText(this, "Press Back again to Exit.",
                        Toast.LENGTH_SHORT).show();
                exit = true;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        exit = false;
                    }
                }, 2 * 1000);

            }
        } else {
            getSupportFragmentManager().popBackStackImmediate();
            int c = getSupportFragmentManager().getBackStackEntryCount();
        }
    }

以这种方式使用:
Fragment fragment;
   fragment = new FS_PLKit_Calculator();        
   ((FS_Home) getActivity()).openFragment(fragment);

尝试这种方式,您可以维护流程的后退堆栈。

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