Fragment ReenterTransition无效.需要帮助澄清各种片段转换

Sou*_*ion 7 android fragment-transitions

我正在RecyclerView中的项目之间实现片段转换动画,以及显示所单击项目的详细信息的片段.换句话说,比较常见......

"点击列表中的卡片,它会扩展到详细视图,而列表的其余部分消失"

...之类的事情.

从RecyclerView项目到详细视图的转换工作正常.项目的共享元素正在转换到新状态,而其余的RecyclerView项目则逐渐消失.

但是,当弹出BackStack时,共享元素会转换回旧状态,但其他RecyclerView项目不会淡入.它们会立即出现在动画的开头,正如您在此屏幕视频中看到的那样

该活动处理了相当多的片段,因此我使用以下通用方法进行事务处理:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setFragment(int fragId, Bundle args, List<Pair> transitionViews,
        String tag, int containerId) {

    // Setup the new fragment and transaction
    Fragment newFragment = FragmentFactory.newFragment(fragId, args);
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(containerId, newFragment, tag);
    fragmentTransaction.addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && transitionViews != null) {

        // Add the shared elements
        for (int i = 0; i < transitionViews.size(); i++) {
            final Pair pair = transitionViews.get(i);
            fragmentTransaction.addSharedElement((View) pair.first, (String) pair.second);
        }

        // Setup the transitions
        Transition transitionMove = TransitionInflater.from(this).inflateTransition(android.R.transition.move);
        Transition transitionFade = TransitionInflater.from(this).inflateTransition(android.R.transition.fade);
    //        transitionFade.setDuration(500);  // Slow down the transition to help see what's happening

        // Apply the relevant transitions to each fragment
        newFragment.setSharedElementEnterTransition(transitionMove);
        newFragment.setEnterTransition(transitionFade);
        newFragment.setExitTransition(transitionFade);
        mCurrentFragment.setExitTransition(transitionFade);
        mCurrentFragment.setReenterTransition(transitionFade);
        mCurrentFragment.setSharedElementReturnTransition(transitionMove);
    }

    fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
  • 我尝试过在允许/不允许进入/返回时转换重叠.
  • 我尝试过使用Fragments的各种过渡设置方法.
  • 我已经阅读了大量有关此主题的博客和SO问题.

我在这个主题上找到了http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html博客,而brockoli的示例代码非常有用,但一直无法解决问题.


也许这是我对每次转换的理解的问题?
这是我理解它的方式.

mCurrentFragment和我newFragment有5个不同的转换设置器:

  1. setSharedElementEnterTransition 设置将用于传输到内容场景的共享元素的Transition.
  2. setSharedElementReturnTransition设置将用于在后端堆栈弹出期间传回的共享元素的Transition .
  3. setEnterTransition 设置将用于将视图移动到初始场景的Transition.
  4. setExitTransition设置当不弹出后端堆栈时删除,隐藏或分离片段时,将用于将视图移出场景的Transition .
  5. setReenterTransition设置由于弹出后端堆栈而在返回时用于将视图移动到场景中的Transition .

setFragment调用我的方法时,将播放一个动画mCurrentFragment,newFragment其中包含以下属性:

  • 所述newFragmentSharedElementEnterTransition定义了如何共享元素会过渡到newFragment.
    (在我的例子中,点击的项目的CardView展开,其中包含的TextView之一被移动)
  • 所述newFragmentEnterTransition定义如何剩余newFragment这些子视图不是共享的元件将转变到屏幕上.
    (在我的情况下,工具栏在屏幕底部淡入.实际上工具栏正在退出现有的RecyclerView后面.有没有办法交换它,所以它在前面?)
  • 所述mCurrentFragmentExitTransition定义如何mCurrentFragment被子视图不是共享的元件将关闭屏幕的转换.
    (在我的情况下mCurrentFragment只包含RecyclerView,因此效果是其余的RecyclerView元素在后台逐渐消失)

弹出BackStack时,我希望会发生以下情况:

  • SharedElementReturnTransition用于mCurrentFragment定义共享元素将如何转换回mCurrentFragment.
    (在我的情况下,CardView收缩回到RecyclerView项目大小,它包含的TextView被移回).
  • ExitTransition用于newFragment定义不共享元素newFragment子视图将如何从屏幕转换. (在我的情况下,底部的ToolBar淡出)
  • ReenterTransition用于mCurrentFragment定义非共享元素的剩余mCurrentFragment子视图将如何转换回屏幕. (在我的情况下,其他RecyclerView项目应该淡入,但这不会发生.它们在转换共享元素后立即可见).

我误解了什么吗?