【问题标题】:Return back to specific fragment of Activity-A from another Activity从另一个 Activity 返回到 Activity-A 的特定片段
【发布时间】:2017-10-02 10:32:24
【问题描述】:

我从Activity-A 打开Message-Fragment,然后从Message-Fragment 打开Camera-Fragment。现在当前片段是Camera-Fragment,我上面有媒体滑块。现在我有两个选项,一个是ImagePreview-Fragment,如果我单击媒体滑块上的图像项,就会打开它。其他是VideoPreview-Activity,如果单击媒体滑块上的视频项目,则会打开。所以点击video-item有一个条件。如果我单击媒体滑块上的视频项并且视频大小大于 10 MB,我打开VideoTrim-Activity,完成修剪后我调用VideoPreview-Activity

我正在从VideoPreview-ActivityImagePreview-Fragment 发送媒体。因此,当我发送媒体时,我想将数据返回到Message-Fragment

我怎样才能从VideoPreview-Activity(从Camera-Fragment打开)和VideoPreview-Activity(从VideoTrim-Activity打开)返回Message-Fragment。此外,如果您能帮助我了解如何从ImagePreview-Fragment 返回到Message-Fragment,我将不胜感激。这些是分开的问题。希望你能帮忙。

我通过添加到后台堆栈addToBackStack(fragmentTag) 打开片段。

已编辑:VideoPreview-Fragment 必须是 VideoPreview-Activity 并且 VidoTrim-Fragment 必须是 VideoTrim-Activity。这些是活动。就像你在图片上看到的那样。

【问题讨论】:

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

标签: android android-fragments android-intent android-activity


【解决方案1】:

如果我正确理解了所有内容,我认为我有一个解决方案。我将忽略导航的所有其他方面,只关注您想要从VideoPreviewActivityMainActivity 并调整片段堆栈的事实,并且这是从完成按钮(或类似的东西)触发的,但是不是后退按钮。

简单的方法是使用活动结果函数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);
  • 不,你说得对,这就是我的例子的问题。你可以做 "CAMERA_TAG" INCLUSIVE 或 "MESSAGE_TAG" 0。我会修正我的答案。
  • 使用 MESSAGE_TAG 0 可能会更好,因为即使您添加不同的片段,它仍然可以工作。
  • 那么我将使用 MESSAGE_TAG 0。再次感谢您的努力。如果您将我的问题标记为有用,我将不胜感激。
  • @Gapp 我不明白您在上面实现的从活动返回到先前特定片段的方式。???您能否再次对此发表评论。我也有同样的问题。我想回到我之前的片段活动,如何回去,当我启动 Intent 时它会回到家
【解决方案2】:

试试这个,

先取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);

尝试这种方式,您可以维护流程的回溯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多