使用 ScrollView 返回 Fragment 时的 Android 共享元素转换

标签 android android-fragments gridview shared-element-transition

我有一个 GridView包裹在 ScrollView 里面在里面让我们调用 fragment A 和一些 CardViews里面GridView .我知道GridViews是可滚动的,但我扩展了 GridView 的高度到它的内容高度,因为我想要 GridView 中的元素和上面的布局,两者一起滚动。我很清楚这不是使用 GridView 的正确方法但我这样做有我自己的理由,所以请忽略它。

无论如何,问题在于共享元素(CardView)转换在从 fragment A 到 fragment B 时效果很好,但在通过按下后退按钮或使用 fragmentManager.popBackStack(); 从 fragment B 返回到 fragment A 时效果不佳。

我设置了 transitionName CardViews 的值以编程方式为每个 CardView 设置唯一值在我用于 Gridview 的适配器中并通过 CardView 上的 bundle 参数将其传递给 fragment B的 onClick方法。然后在onCreateView fragment B 的方法我将相同的值设置为 CardView也在里面。

这是我用来切换到 fragment B 的代码:

Fragment fragment = new FragmentB()
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            // Defines enter transition only for shared element
            Transition changeBoundsTransition = TransitionInflater.from(mContext).inflateTransition(android.R.transition.move);
            fragment.setSharedElementEnterTransition(changeBoundsTransition);
            bundle.putString("transitionName", "card" + p.getId());
            fragment.setArguments(bundle);
            fragmentManager.beginTransaction()
                    .replace(R.id.main_container_wrapper, fragment)
                    .addToBackStack("package_root")
                    .addSharedElement(cv, "card" + p.getId())
                    .commit();

        }

这是 onCreateView FragmentB的方法:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        String transitionName = getArguments().getString("transitionName");
        view.findViewById(R.id.cv_selected_package_card).setTransitionName(transitionName);
}

正如我上面所说,共享元素转换在转到 FragmentB 时效果很好。但从那里回来时不是。

我认为正在发生的是 FragmentAFragmentB 返回时重新加载这就是为什么离开滚动状态和返回滚动状态时滚动状态不会保持不变并且从顶部显示的原因。但是 Scroll 不是这里的主要问题,因为即使我选择第一个 CardView在不向下滚动的情况下位于顶部,共享元素过渡在向后导航时不起作用。

目标 API 版本为 25,构建 API 版本为 25,我在虚拟设备 android API 级别 25 上测试应用。

所以知道我该如何解决这个问题。

最佳答案

问题是我用来切换到下一个 fragment 的 replace() 方法。这将破坏 fragment 并将其从 fragment 管理器中删除,并在需要时再次添加回来。因此,为了防止这种情况发生,我使用 add() 方法添加下一个 fragment ,并使用 hide() 方法隐藏当前 fragment 。

代码如下:

Fragment currentFragment = fragmentManager.findFragmentById(R.id.main_container_wrapper);
fragmentManager.beginTransaction()
               .hide(currentFragment)
                .add(R.id.main_container_wrapper, fragment)
                .addToBackStack(null)
                .addSharedElement(cv, "card" + p.getId())
                .commit();

关于使用 ScrollView 返回 Fragment 时的 Android 共享元素转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542686/

相关文章:

android - 从 fragment 对话框中显示 fragment

javascript - 如何将 GridView 中控件的 id 传递给 Jquery?

android - 清除 GridView 并在 android 中重新生成它

android - 已连接到 Spotify AP,但 GetConnectionState(),用户尚未登录

android - 在 Kotlin 中为 recyclerView 的 child 的 child 设置监听器

android - Facebook Android - 安装应用程序和参与应用程序 Activity 未提供延迟链接

android - 在 RelativeLayout 中使用 StickyGridHeaders 错误

java - 显示相同的 Android fragment 两次并使用调用 getById

android - 使用 DialogFragment 时如何连接到后退事件?

mysql - Shield UI 网格日期 : how to format