我有一个 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
时效果很好。但从那里回来时不是。
我认为正在发生的是 FragmentA
从 FragmentB
返回时重新加载这就是为什么离开滚动状态和返回滚动状态时滚动状态不会保持不变并且从顶部显示的原因。但是 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/