【发布时间】:2019-10-11 15:48:27
【问题描述】:
我正在尝试在两个片段(BlankFragment 和 BlankFragment2)之间使用共享元素动画。 BlankFragment 有一个回收器视图,BlankFragment2 是一个详细信息屏幕。他们共享一张图片,我正在使用新的导航组件。
在 BlankFragment 中,我正在构建 FragmentNavigator.Extras 并将 extra 传递给我对 navigate 的调用,并使用共享图像的过渡名称(因为它是一个回收器视图,并且这些必须是唯一的),
在 BlankFragment2 中,我收到此名称,将其设置为我的图像并设置 setSharedElementEnterTransition
结果是进入动画工作正常但退出/返回没有,我尝试设置它们而不是设置它们(因为我相信导航组件应该为我处理这个)有人可以帮忙吗?
MainActivity 导航设置
private void setNavigation() {
navController = Navigation.findNavController(this, R.id.main_fragment);
NavigationUI.setupActionBarWithNavController(this, navController);
}
处理返回按钮
@Override
public boolean onSupportNavigateUp() {
return Navigation.findNavController(this, R.id.main_fragment).navigateUp()
|| super.onSupportNavigateUp();
}
BlankFragment OnClick
@Override
public void onClick(View view, int position) {
NavController navController = Navigation.findNavController(recyclerView);
FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder().addSharedElement(view, view.getTransitionName()).build();
BlankFragmentDirections.ActionBlankFragmentToBlankFragment2 directions = BlankFragmentDirections.actionBlankFragmentToBlankFragment2(view.getTransitionName());
navController.navigate(directions,extras);
}
BlankFragment2 onCreate 带有返回/退出转换
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.no_transition));
setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
getFragmentArguments();
}
获取参数方法
private void getFragmentArguments(){
if (getArguments() != null){
transitionName = BlankFragment2Args.fromBundle(getArguments()).getTransitionName();
Log.d(TAG, "transition name " + transitionName);
}
}
设置图像过渡名称
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
image = view.findViewById(R.id.image);
image.setTransitionName(transitionName);
text = view.findViewById(R.id.text);
}
【问题讨论】:
-
我从这里 (stackoverflow.com/a/53646395/137401) 发现有一个开放的错误 (issuetracker.google.com/issues/118475573)
-
这不是错误,而是预期的行为。关键在于使用
postponeEnterTransition()和startPostponedEnterTransition()等待视图解决。查看更多:chris.banes.dev/2018/02/18/fragmented-transitions
标签: android material-design android-transitions shared-element-transition android-jetpack-navigation