android - 共享元素转换 : activity into fragment nested in another activity

标签 android android-fragments android-transitions

我正在尝试将共享元素转换添加到我的应用中。

场景是用户点击图像缩略图,然后打开另一个全屏 ImageView 的 Activity 。

如果共享 View 直接托管在目标 Activity 的布局中,则此方法可以正常工作。适用于进入/退出动画。 但是,当我试图在目标 Activity 中嵌套 fragment 中实现类似的效果时,这种方法不起作用。有趣的是没有显示进入动画,但退出动画工作正常。

另一个更复杂的 View 层次结构是,如果目标 View (ImageView)托管在 View 分页器中,而分页器托管在目标 Activity 的框架布局中。

有人有同样的问题吗?

编辑: 我的点击监听代码

public class OnClickPicture extends OnClickBase {
  private ObjectPicture object;

  public OnClickPicture(Activity_Parent activity, ObjectPicture object) {
    super(activity);
    this.object = object;
  }

  public void onClick(View v) {

    picasso.load(object.getFullUrl()).fetch();
    Intent intent = new Intent(activity, ActivityPicture.class);
    intent.putExtra("picture_object", helper.gson.toJson(object));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && v != null) {
      Pair<View, String> p1 = Pair.create(v, "image");
      ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, p1);
      activity.startActivity(intent, options.toBundle());
    } else {
      activity.startActivity(intent);
    }

  }

}

最佳答案

过渡的工作方式要求在任何动画发生之前创建、测量和布置新的 Activity。这样它就可以找到您想要设置动画的 View 并创建适当的动画。

在您的情况下,这不会发生,因为 stated in the docs ,所有 FragmentTransaction.commit() 所做的就是安排要完成的工作。它不会立即发生。因此,当框架创建您的 Activity 时,它找不到您想要动画的 View 。这就是为什么您看不到进入动画但确实看到退出动画的原因。当您离开 Activity 时, View 就在那里。

解决方案很简单。首先你可以试试FragmentManager.executePendingTransactions() .那可能还不够。过渡框架还有另一种解决方案:

在Activity的onCreate中postponeEnterTransition() .这告诉框架等到你告诉它创建动画是安全的。这确实意味着您需要在某个时候告诉它它是安全的(通过调用 startPostponedEnterTransition() )。在您的情况下,这可能在 Fragments onCreateView 中。

下面是一个示例:

Activity B

@Override
protected void onCreate(Bundle savedInstanceState) {
    // etc
    postponeEnterTransition();
}

fragment B

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View sharedView = root.findViewById(R.id.shared_view);
    sharedview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            sharedview.getViewTreeObserver().removeOnPreDrawListener(this);
            getActivity().startPostponedEnterTransition();
            return true;
        }
    });
}

感谢 Alex Lockwood 的 detailed blog posts about the Transitions framework .

关于android - 共享元素转换 : activity into fragment nested in another activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596602/

相关文章:

android - 服务不总是重新启动,无法获取日志

Android:在新的应用程序版本中更改小部件的布局/内容

android - 未执行 Activity 转换 (Lollipop)

android - Recyclerview 和 Detailsfragment : elevation, 层次结构之间的共享元素转换,bringToFront

android - fragment 进入过渡的问题

android - ListView快速滚动条bug

javascript - Android与JavaScript、JS如何获取webview JS返回数据?

android - 如何在 Android 中从 Activity 移动到 Fragment?

android - 如何在屏幕方向更换后恢复 fragment

java - 'TAG' 在 'android.support.v4.app.FragmentActivity' 具有私有(private)访问权限