Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments Android-Recyclerview共享元素转换项位置_Android Fragments_Android Recyclerview_Shared Element Transition - Fatal编程技术网

Android fragments Android-Recyclerview共享元素转换项位置

Android fragments Android-Recyclerview共享元素转换项位置,android-fragments,android-recyclerview,shared-element-transition,Android Fragments,Android Recyclerview,Shared Element Transition,我希望你能帮我解决这个问题。我有两个片段,第一个是带有多个图像的recyclerview,第二个片段是这些图像的详细视图。如果用户单击图像,应用程序将执行片段事务,并显示详细信息 我已经成功实现了片段之间的共享元素转换,如果我单击第一个片段上的小图像,它会变大并移动到细节视图上的最终位置 那么,问题是,图像的初始位置不是预期的,它开始从原始位置移动几个像素,当我单击图像时,图像会向右和向下跳一点 为什么会这样?真烦人 转换xml: <transitionSet xmlns:android=

我希望你能帮我解决这个问题。我有两个片段,第一个是带有多个图像的recyclerview,第二个片段是这些图像的详细视图。如果用户单击图像,应用程序将执行片段事务,并显示详细信息

我已经成功实现了片段之间的共享元素转换,如果我单击第一个片段上的小图像,它会变大并移动到细节视图上的最终位置

那么,问题是,图像的初始位置不是预期的,它开始从原始位置移动几个像素,当我单击图像时,图像会向右和向下跳一点

为什么会这样?真烦人

转换xml:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform />
    <changeBounds />
</transitionSet>


如果我对recyclerview外的一个按钮做同样的操作,它会工作得很好。这是回收视图中的某种错误吗?

如果您的共享元素是
ImageView
s,那么您也需要使用
ChangeImageTransform
转换。尝试将
添加到您的转换集。

您的RecyclerView项目需要在其共享视图上设置唯一的转换名称。如果设想RecyclerView的渲染布局层次结构,其中将有许多具有相同转换名称的项(视图)。这样,就不清楚转换的实际共享元素是什么。例如,您可以将位置附加到视图转换名称,例如transition1、transition2等。现在,当您启动详图片段时,必须将转换名称交给它,并将此名称设置为详图片段中的共享视图,例如在onViewCreated()中.

如果没有从回收者视图中获取正确的视图,则可能发生这种情况。确保使用精确视图(基于位置)而不是根视图。例如,在以下代码段中,应使用视图v(在onClick()中接收):

mAdapter.setOnItemClickListener(

                new MyAdapter.OnItemClickListener() {

                    @Override
                    public void onClick(View v, int position) {

                        ImageView heroView;
                        heroView = (ImageView) v.findViewById(R.id.category_icon);
                        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                                getActivity(), heroView, heroView.getTransitionName());
                        ActivityCompat.startActivity(getActivity(), intent, options.toBundle());

我通过阅读本文解决了这个问题,这篇文章显示了代码片段并给出了详细的解释

确保共享元素之间的
android:transitionName
必须是相同的,并且在视图层次结构中必须是唯一的

至于
RecyclerView
Fragment
,如果我们在XML中设置
transitionName
,那么库中的所有ImageView都将具有相同的一个,这意味着当我们回到库中时,框架将不知道将图像移动到何处


由于项目位置是唯一的,因此最好在这里使用position在
onBindViewHolder

中设置transitionName。对于其他有这些问题的人,我通过确保对两个共享元素应用相同的图像转换来解决这个问题。在我的例子中,我没有对我的片段2应用任何转换,而对我的片段1应用了中心裁剪,这导致了视觉错误。

也希望对此进行澄清,因为我遇到了类似的问题today@AndyRoid如果你发现如何修复它,请让我们知道你能发布你正在使用的任何相关代码吗?一段说明这个问题的视频可能也会有帮助(Android Studio的屏幕捕获功能在这里可以派上用场)。谢谢你的帮助,但我已经尝试了很多转换组合,结果还是一样的。