Android共享元素返回到之前的活动

时间:2017-03-05 13:31:00

标签: android transitions android-transitions

我有3项活动:ActivityA - > ActivityB - > ActivityC

我有一个从ActivityAActivityB的共享元素转换,这个缩略图会逐渐成为ActivityB的背景。如果我点击"返回"在ActivityB中,调用返回共享元素转换:背景视图缩小回ActivityA中的缩略图位置。

如果我没有点击"返回",ActivityB会加载一些数据,导航到ActivityC并完成。

ActivityC的观点与ActivityAActivityB之间共享的观点相同(同样transitionName也是如此)。当我点击"回来"来自ActivityC,我希望调用返回共享元素转换的方式与调用" back"时调用的方式相同。从ActivityBActivityA - 将背景缩小回ActivityA中的缩略图位置。

导航代码:

/* thumbnailView is the view in ActivityA that grows into ActivityB */
void navigateToActivityB(Activity activityA, View thumbnailView) {

    // Build options
    List<Pair<View, String>> pairs = new ArrayList<>();
    pais.add(Pair.create(thumbnailView, "thumbnailTransition"));
    Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activityA, pairs.toArray(new Pair[pairs.size()])).toBundle();

    // Navigate
    Intent intent = new Intent(activityA, ActivityB.class);
    ActivityCompat.startActivity(activityA, intent, options);
}

/**
 * Here I don't have thumbnailView anymore (since it's in ActivityA
 * and I'm coming from ActivityB, so I can't include it in the
 * shared element pairs.
 */
void navigateToActivityC(Activity activityB) {

    // Build options - I wish I could use the pairs but I don't know how
    // List<Pair<View, String>> pairs = new ArrayList<>();
    // pais.add(Pair.create(thumbnailView, "thumbnailTransition"));
    Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activityB).toBundle();

    // Navigate
    Intent intent = new Intent(activityB, ActivityC.class);
    ActivityCompat.startActivity(activityB, intent, options);
}

ActivityB

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TransitionInflater inflater = TransitionInflater.from(context);
    getWindow().setSharedElementEnterTransition(inflater.inflateTransition(R.transition.shared_element_enter));
    getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.shared_element_return));

ActivityC

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TransitionInflater inflater = TransitionInflater.from(context);

    // This transition doesn't work :(
    getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.shared_element_return));

编辑:

值得一提的是,我在一个静态变量中保留了ActivityA的缩略图视图。然后在导航到ActivityC时,我使用此视图生成options参数的方式与我在navigateToActivityB中的方式相同,在这种情况下,返回转换有效。这不是一个可行的解决方案,因为以这种方式保存视图非常糟糕(但我没有其他方法可以在活动之间传递视图),并且因为它导致了一些奇怪的工件(一种奇怪的闪烁) ActivityB)中的缩略图。

1 个答案:

答案 0 :(得分:1)

作为documentation

  

setSharedElementReturnTransition

     

设置将用于传输回调用Activity的共享元素的Transition。

在这里,您完成了调用活动ActivityB。这意味着它不会返回到调用活动。因此不显示Transition。

您可能想要使用setSharedElementExitTransition