如何从一个Fragment到一个Activity实现共享元素过渡效果

13

我在一个活动中的ViewPager内有三个片段,我希望实现共享元素转换,从其中一个片段转到另一个活动。 转换是从包含在片段内的Recyclerview开始的,该片段位于包含在活动中的Viewpager内部。 活动->ViewPager->片段->RecyclerView

我已经在互联网上搜索了每个地方,但只有关于从一个片段到另一个片段以及从一个活动到另一个活动的共享元素转换的信息。 没有内容涉及从片段到活动的过渡。

holder.poster.setTransitionName("posterX");
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) con,holder.poster,holder.poster.getTransitionName());
            Log.e("Animation", "Success");
            //startActivity((Activity) con,intent,options.toBundle());
            c.startActivity(intent,options.toBundle());

使用上述代码后,第二个活动被启动但是没有显示任何内容。例如,第二个活动包含一个FAB(浮动操作按钮),当点击它时会启动YouTube。我知道FAB在哪里,所以当我盲目点击时,YouTube正确地启动了,但是第二个活动中没有显示任何内容。

D/ViewRootImpl: changeCanvasOpacity: opaque=true

这是其中一个日志记录。 我认为这一定是问题所在!!

4个回答

3
我终于找到了答案,startActivity调用方法不同。你需要调用
startActivityFromFragment(fragment, intent, req_code, options.toBundle());

从AppCompactActivity中


我在AppCompatAcitivty上没有看到那个方法。请编辑您的答案。 - amlwin
@LwinMyoAung,我不知道为什么你看不到这个,但是这在Android文档中是存在的。https://developer.android.com/reference/android/support/v7/app/AppCompatActivity - Koma Yip
你应该使用 getBaseActivity().startActivityFromFragment.. 来访问该方法。 - ghita
查看Fragment类的源代码,您可以看到startActivity方法实际上“调用”了片段活动的startActivity方法(好吧,不完全是 - 它调用了FragmentHostCallback#onStartActivityFromFragment)。 - Edric

2

从片段到活动的方式与从活动到活动的方式相同,因为您的片段位于一个活动中。


理论上是正确的,但实际上当你编写代码时,你会从片段中编写转换,因为元素不在活动中而在片段中。因此最终是从片段到活动。 - Adarsh Jain
@M. Reza Nasirloo,你能帮我解决这个问题吗:https://stackoverflow.com/questions/50319202/fragment-to-activity-shared-element-transition-is-not-working - blackHawk

2
我遇到了同样的问题,很抱歉我找不到任何有用的帮助。但是,也许你应该重新考虑为什么需要 Fragment 到 Activity 的关系,而不是使用 Fragment 到 Fragment 或 Activity 到 Activity 的关系。
我通过将代码更改为 Fragment 到 Fragment 的关系来解决我的问题,并且有大量关于此的文档和示例,可以参考共享元素转换

所以我会尝试使用嵌套片段并回复! - Adarsh Jain
此刻还不可能实现。 - Carlos

1

我认为可以使用如下的 Pairs:

 Pair[] pairs = new Pair[1];
            pairs[0] = new Pair<View, String>(tvArtifacts, "itemTrans");
            ActivityOptions options = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                options = ActivityOptions.makeSceneTransitionAnimation(getActivity(), pairs);
            }

            Intent i = new Intent(getActivity(), ItemDetailActivity.class);
            i.putExtra("item_name", "item 2");
            if (options != null) {
                startActivity(i, options.toBundle());
            } else {
                startActivity(i);
            }

这对我有用!谢谢..


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