android - 导航组件共享元素转换适用于输入,但不适用于弹回

标签 android material-design android-transitions shared-element-transition android-jetpack-navigation

我正在尝试在 2 个 fragment BlankFragment 和 BlankFragment2 之间使用共享元素动画。 BlankFragment 有一个回收器 View ,BlankFragment2 是一个详细信息屏幕。他们共享一张图片,我正在使用新的导航组件。

在 BlankFragment 我正在构建 FragmentNavigator.Extras并将附加信息传递给我对 navigate 的调用使用共享图像的转换名称(作为它的回收器 View ,这些必须是唯一的),

在 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);

}

最佳答案

java
要修复返回转换,请使用 viewTreeObserver.addOnPreDrawListener
在 BlankFragment 中(带有回收 View 的 fragment )

  • 我们需要调用postponeEnterTransition();所以过渡
    将被推迟
  • 在 recycleView 上设置 addOnPreDrawListener 如下
    RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
    //setup for recycle view adapter 
    
    ViewTreeObserver viewTreeObserver = recyclerView.getViewTreeObserver();
    viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            startPostponedEnterTransition();
            return true;
        }
    });
    

  • 而已。
    点击此链接以获取有关 ViewTreeObserver 的更多信息,请关注 link
    鳍!!

    关于android - 导航组件共享元素转换适用于输入,但不适用于弹回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302843/

    相关文章:

    android - Activity 转换不起作用

    java - If 语句不返回值

    javascript - 了解 Angular Material gridList

    java - 我们可以使用 FirebaseListAdapter 来填充 android 中的 TabLayout 吗?

    Android 全屏对话框 fragment ,如日历应用程序

    android - 在概览(最近的应用程序)屏幕中设置应用程序的标题颜色

    android - 取消共享元素转换

    Android Activity 转换 - Window.excludeTarget() 阻止 subview 的转换

    android - 通过 Facebook Connect Android 验证用户

    android - 是否可以将代码包含/导入到 Android list 中?