如何共享元素从片段到活动的过渡

Posted

技术标签:

【中文标题】如何共享元素从片段到活动的过渡【英文标题】:how to Shared element transition from a fragment to an activity 【发布时间】:2016-11-30 07:32:05 【问题描述】:

我在一个活动的 ViewPager 中有三个片段,我想实现从一个片段到另一个活动的共享元素转换。转换来自一个回收器视图,该视图位于片段内部,该片段位于 Activity 内部的 viewpager 内部 Activity->ViewPager->Fragment->Recyclerview

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

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

它是日志猫之一。 我想这一定是问题!

【问题讨论】:

【参考方案1】:

终于找到答案了,startActivity调用方式不一样。 你必须打电话

startActivityFromFragment(fragment, intent, req_code, options.toBundle());

来自 AppCompactActivity

【讨论】:

我在 AppCompatAcitivty 上没有看到该方法。请编辑你的答案 @LwinMyoAung,我不知道你为什么看不到这个,但是这个存在于android文档developer.android.com/reference/android/support/v7/app/… 你应该使用getBaseActivity().startActivityFromFragment..来访问该方法 查看Fragment 类的源代码,您可以看到startActivity 方法实际上“调用”了片段活动的startActivity 方法(嗯,不是真的-它调用@987654327 @)。【参考方案2】:

我遇到了同样的问题,抱歉,我找不到任何有用的信息,但也许您应该重新考虑,当您可以使用 Fragment 到 Fragment 或 Activity 到 Activity 关系时,为什么还需要 Fragment 到 Activity 关系。

我已经通过将代码更改为片段到片段关系的方式解决了我的问题,并且有大量关于 Shared Element Transitions 的文档和示例

【讨论】:

所以我尝试使用嵌套片段并回复! 目前不可能【参考方案3】:

Fragment 到 Activity 和 Activity 到 Activity 是一样的,因为你的 Fragment 在 Activity 内部。

【讨论】:

理论上它是正确的,但实际上,当您编写代码时,您会从片段中编写过渡,因为元素不在片段中的活动中。所以最终它是活动的片段。 @M. Reza Nasirloo 你能帮我解决这个问题吗:***.com/questions/50319202/…【参考方案4】:

我认为使用 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);
            

这对我有用! 谢谢..

【讨论】:

以上是关于如何共享元素从片段到活动的过渡的主要内容,如果未能解决你的问题,请参考以下文章

如何实现与视频的共享元素过渡

共享元素返回过渡不适用于片段中的 recyclerview 和 cardview

使用片段共享过渡时返回过渡无法正常工作

Android:无法使用 Google Maps Fragment 进行共享元素转换

片段之间的共享元素转换

如何启动2活性之间共享单元的过渡?