android - 共享元素转换没有预期的行为

标签 android android-fragments android-5.0-lollipop android-recyclerview shared-element-transition

我实现了从 RecyclerView 中的图像到新 Fragment 中的图像之间的共享元素转换。 RecyclerView 托管在由 Activity 托管的 fragment 中,目标 fragment 托管在另一个 Activity 中。

当我点击我的图片时,过渡按预期进行,我到达了我的 fragment 。但是当我单击后退按钮时,转换试图将我的图像放在我的 RecyclerView 的第一个位置,而它当前显示的图像不一定是第一个。

从这种情况来看,我想因为它是一个图像列表,我在 XML 中设置了一个转换名称,也许在返回时,因为所有图像都有相同的转换名称,所以过程很困惑,只得到第一张图像用给定的名字。所以也许我应该动态地给他们每个人一个不同的过渡名称。我还为目标图像设置了相同的名称,并在每次选择新图像时重置它。但它仍然无法正常工作。谁能帮我解决这个问题?

这是我的 onItemClickListener 中的代码:

mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
    @Override
    public void onItemClick(View view, int position) {
        final RssItem item = mAdapter.getItem(position);
        final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
        // mRootView is the view of the fragment
        final ImageView image = (ImageView) 
mRootView.findViewById(R.id.rss_element_image);
        image.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + position);
        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                        getActivity(), image, RssElementFragment.EXTRA_IMAGE);
        ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
    }
});

这是目标 fragment 中的代码:

rssImage.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + getArguments().getInt(ARG_ELEMENT_POSITION));
ViewCompat.setTransitionName(rssImage, EXTRA_IMAGE);

这里是 themes.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/theme_primary</item>
        <item name="colorPrimaryDark">@color/theme_primary_dark</item>
        <item name="android:colorAccent">@color/theme_accent</item>

        <!-- enable window content transitions -->
        <item name="android:windowContentTransitions">true</item>

        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>

        <!-- specify shared element transitions -->
        <item name="android:windowSharedElementEnterTransition">
            @transition/change_image_transform
        </item>
        <item name="android:windowSharedElementExitTransition">
            @transition/change_image_transform
        </item>

    </style>

编辑:

我发现了我的错误,我从 fragment roo​​tView 获取了 ImageView,它从我的 RecyclerView 给我一个随机 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的 View 并且它起作用了!我还将 setTransitionName() 移到适配器中。

mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
        @Override
        public void onItemClick(View view, int position) {
            final RssItem item = mAdapter.getItem(position);
            final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
            // WRONG !
            // final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
            // Correct
            final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);

            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                            getActivity(), image, RssElementFragment.EXTRA_IMAGE);
            ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
        }
    });

最佳答案

我发现了我的错误,我从 fragment roo​​tView 获取了 ImageView,它从我的 RecyclerView 给我一个随机 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的 View 并且它起作用了!我还将 setTransitionName() 移到适配器中。

mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
        @Override
        public void onItemClick(View view, int position) {
            final RssItem item = mAdapter.getItem(position);
            final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
            // WRONG !
            // final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
            // Correct
            final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);

            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                            getActivity(), image, RssElementFragment.EXTRA_IMAGE);
            ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
        }
    });

关于android - 共享元素转换没有预期的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339690/

相关文章:

android - 自定义搜索 View 中的关闭图标

android - 在android SDK中匹配两种格式的电话号码的最佳方法是什么?

java - 抽屉菜单未显示在 ViewPager + ActionBar.Listener 中

android - 在 Android 上恢复 FragmentActivity 后的 “java.lang.IllegalStateException: Activity has been destroyed”

android - 在我的布局文件中使用 CardView 和 RecyclerView 会引发异常

java - 创建嵌入 IF 逻辑的文件

android - 我需要在我的 ExpandableListView 中延迟我的组的扩展

java - 使用标签在同一 Activity 的 fragment 之间传输多个字符串

java - 在 Image View 上设置波纹效果

android - adb 安装 - 失败 [0]