我在{@ 1}}内部调用片段A中的GridView
和ScrollView
内的CardViews
内部GridView
。我知道GridViews
是可滚动的,但我将GridView
的高度扩展到了内容的高度,因为我希望GridView
中的元素和上面的布局,两者都滚动在一起。我很清楚这不是使用GridView
的正确方法,但我有自己的理由这样做,所以请忽略它。
无论如何,问题是共享元素(CardView
)转换在从片段A到片段B的过程中运行良好,但是当通过按下后退按钮或使用{{1}从片段B返回到片段A时则不行}
我以编程方式将fragmentManager.popBackStack();
值transitionName
设置为适配器中每个CardViews
的唯一值,我将其用于CardView
并将其传递给片段B包含Gridview
' CardView
方法的包参数。然后在Fragment B的onClick
方法中,我将相同的值设置为其中的onCreateView
。
这是我用来切换到片段B的代码:
CardView
这里是FragmentB的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
如上所述,共享元素转换在转到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
返回时会重新加载,这就是为什么滚动状态离开时以及回到它时的原因并非如此。保持不变,从顶部显示。但Scroll可能不是这里的主要问题,因为即使我在顶部选择第一个FragmentB
而不向下滚动,共享元素转换也无法导航回来。
目标API版本为25,构建API版本为25,我在虚拟设备android API级别25上测试应用程序。
所以任何想法如何解决这个问题。
答案 0 :(得分:1)
问题是我用来切换到下一个片段的replace()
方法。这会破坏片段并将其从片段管理器中删除,并在需要时再将其添加回来。因此,为了防止这种情况发生,我使用add()
方法添加下一个片段,并hide()
隐藏当前片段。
以下是代码:
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();