【发布时间】:2018-02-26 16:10:45
【问题描述】:
在我的应用程序中,我有一个 Activity 启动另一个带有 Fragment 的 Activity,其中包含一个 ViewPager 图像。我目前所做的是进入转换,第一个活动启动第二个并且转换是正确的。这是因为,在我的 ViewPager 中,我在其上放置了 OnPreDrawListener,并且仅在加载寻呼机中的图像时才恢复活动转换。它看起来像这样:
public class ImagePagerAdapter extends PagerAdapter {
// Constructor and other things..
@Override
public Object instantiateItem(ViewGroup container, final int position) {
ImageView imageView;
if (position == 0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Shared element is the first one.
ViewCompat.setTransitionName(imageView, "sharedImage");
}
}
imageView = new ImageView(activity);
// Just a reusable static Helper class.
HelperPicasso.loadImage(images.get(position), imageView, false, new Callback() {
@Override
public void onSuccess() {
imageView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
imageView.getViewTreeObserver()
.removeOnPreDrawListener(this);
// When the ImageView is ready to be drawn, we can continue our activity/fragment's postponed transition animation.
// Why? Because we want have the first image be the shared element, and we can only set it after instantiation.
ActivityCompat.startPostponedEnterTransition(activity);
return true;
}
});
}
@Override
public void onError() {
ActivityCompat.startPostponedEnterTransition(activity);
}
});
}
}
除了 ImageView,我还有一个 FrameLayout,它也是一个共享元素,但我在片段的 onCreateView 中用它的过渡名称标记它。
有了这个,进入过渡对我来说很有效。但是,当我按下后退按钮时,FrameLayout 的退出转换正常工作,但 ViewPager 图像变为空白。
我的猜测是片段的生命周期导致 ViewPager(及其子视图)在退出转换期间被销毁。
我尝试在父 Activity 的 onBackPressed 回调中添加 ActivityCompat.finishAfterTransition(this),但似乎没有任何效果。
【问题讨论】:
-
嗯...您遇到了一个非常复杂的问题,即正确恢复从可回收视图开始的退出转换。操作指南:android.jlelse.eu/…
-
这不是一个选择的设计。 ImageViewPager 只是屏幕的一部分。我也不认为这是一个过于复杂的设计,即想象一个电子商务应用程序,其 ViewPager 图像和 TextViews 等如下。
-
你能分享你的活动和片段类吗?
标签: android android-viewpager shared-element-transition