我实现了如下片段:
代码示例如下:
/*This code does not show animation*/
getChildFragmentManager()
.beginTransaction()
.addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
.replace(R.id.fragment_container, categoryDetailChildFragment)
.addToBackStack(TAG)
.commit();
和显示动画的代码是:
getFragmentManager()
.beginTransaction()
.addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
.replace(R.id.fragment_container, categoryDetailChildFragment)
.addToBackStack(TAG)
.commit();
为什么getChildFragmentManager()时没有共享转换?请帮助任何人。
答案 0 :(得分:1)
每个片段都有自己的childFragmentManager。因此,如果您有多个嵌套片段,一个片段又一个片段,则应引用同一片段的childFragmentManager,在该片段中,您将使用addSharedElement()。
因此,如果您有:
ActivityA
|_ FragmentB
|_ FragmentC
|_ FragmentD
在这种情况下,对于片段C和片段D-,应使用最新的通用片段的getChildFragmentManager()-Fragment B,以确保每个嵌套片段都引用相同的fragmentManager。这就是为什么当您使用活动的fragmentManager时它可以工作的原因,因为只有一个活动,并且每个活动都使用getActivity()引用同一活动
要在嵌套片段中获取父片段,可以在嵌套片段的onAttach()方法上使用getParentFragment()。您也可以将其强制转换为某些类,例如FragmentB:
override fun onAttach(context: Context) {
super.onAttach(context)
val fragment: FragmentB = parentFragment.parentFragment.parentFragment... as FragmentB
}
答案 1 :(得分:0)
从 15:00 到 17:00 观看此视频片段技巧(Google I/O '17)
我遇到了同样的问题。就这样做!
在您的 onCreateView 方法中:
postponeEnterTransition();
final ViewGroup group = inflater.inflate(R.layout.layout_to_inflate,container,false);
ViewTreeObserver.OnGlobalLayoutListener treeObserver = new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
startPostponedEnterTransition();
group.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
group.getViewTreeObserver().addOnGlobalLayoutListener(treeObserver);
确保在调用 addSharedElement() 片段事务调用时调用 setReorderingAllowed(true)!
尝试一下,动画应该可以流畅运行。我知道 Android Fragments 不容易使用!