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

时间:2017-08-07 08:39:27

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

我在{@ 1}}内部调用片段A中的GridViewScrollView内的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); } 时效果很好,但在从它返回时却不行。

我认为发生的事情是FragmentBFragmentA返回时会重新加载,这就是为什么滚动状态离开时以及回到它时的原因并非如此。保持不变,从顶部显示。但Scroll可能不是这里的主要问题,因为即使我在顶部选择第一个FragmentB而不向下滚动,共享元素转换也无法导航回来。

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

所以任何想法如何解决这个问题。

1 个答案:

答案 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();