我从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-Activity
或ImagePreview-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。这些是活动。就像你在图像上看到的一样。
答案 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);
尝试这种方式可以保持流量的背斜。