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

Posted

技术标签:

【中文标题】导航组件共享元素转换适用于输入,但不适用于弹回【英文标题】:Navigation component shared element transitions works for enter but not for popping back 【发布时间】: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);


【问题讨论】:

我从这里 (***.com/a/53646395/137401) 发现有一个开放的错误 (issuetracker.google.com/issues/118475573) 这不是错误,而是预期的行为。关键在于使用postponeEnterTransition()startPostponedEnterTransition() 等待视图解决。查看更多:chris.banes.dev/2018/02/18/fragmented-transitions 【参考方案1】:

Java

要修复返回转换,请使用 viewTreeObserver.addOnPreDrawListener

In BlankFragment(带有回收视图的片段)

    我们需要致电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

鳍!!

【讨论】:

迫不及待想看看这个 不高兴,我实际上开始了一些需要相同功能的新东西(更简单),但它仍然无法工作

以上是关于导航组件共享元素转换适用于输入,但不适用于弹回的主要内容,如果未能解决你的问题,请参考以下文章

函数适用于文本输入,但不适用于数字输入

IE输入元素焦点不适用于角度指令

验证系统 它适用于某些输入,但不适用于其他输入 使用 jQuery

无法弄清楚为啥我的字符、字数和行数适用于文件输入,但不适用于标准输入

我的代码适用于输入文件,但不适用于其他文件。 (调试断言错误)

Jquery 验证不适用于 datepicker 的输入