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

时间:2017-10-02 10:32:25

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

enter image description here

我从Message-Fragment打开Activity-A,然后从Camera-Fragment打开Message-Fragment。现在当前片段是Camera-Fragment,我有媒体滑块。现在我有两个选项,一个是ImagePreview-Fragment,如果我单击media-slider上的图像项,则会打开它。如果单击media-slider上的视频项,则会打开VideoPreview-Activity。因此,有一个点击视频项的条件。如果我点击媒体滑块上的视频项并且视频大小超过10 MB,我会打开VideoTrim-Activity,当修剪完成后,我会拨打VideoPreview-Activity

我从VideoPreview-ActivityImagePreview-Fragment发送媒体。因此,当我发送媒体时,我想返回带有数据的Message-Fragment

如何从Message-Fragment(从相机片段打开)和VideoPreview-Activity(从VideoPreview-Activity打开)返回VideoTrim-Activity。另外,如果您可以帮助我了解如何从ImagePreview-Fragment返回Message-Fragment,我将不胜感激。这些都是分开的问题。希望你能帮忙。

我打开片段并添加到后台筹码addToBackStack(fragmentTag)

编辑:VideoPreview-Fragment必须是VideoPreview-Activity 和VidoTrim-Fragment必须是VideoTrim-Activity。这些是活动。就像你在图像上看到的一样。

2 个答案:

答案 0 :(得分:4)

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

简单的方法是使用活动结果函数startActivityForResult,这将允许您在主活动中使用onActivityResult函数来传回信息。但是,您可能会通过VideoPreviewActivity导航到VideoTrimActivity,因此您必须通过两个有点混乱的活动传递此信息。

所以我提出的解决方案有几个步骤。

而不是在finish()上致电VideoPreviewActivity,而是打算创建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()

答案 1 :(得分: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();
    }

在你的主要活动完成后,然后覆盖像

这样的方法
@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);

尝试这种方式可以保持流量的背斜。