我正在使用从Activity
和RecyclerView
到全屏详细信息GridLayoutManager
屏幕的共享元素来实现基本的Activity
过渡动画。动画在常规情况下效果很好。因此,当单击网格中的图像时,它将缩放为全屏图像,并且退出时会发生相反的情况。但是,如果在显示详细信息屏幕时按电源按钮并返回到应用程序,则Android似乎会清除所有已注册的共享元素/转换,因此全屏图像而不是缩小为网格只会淡出。我尝试在两个SharedElementCallbacks
中注册Activities
,在没有按下电源按钮的情况下可以正常调用它们,但是在按下电源按钮后都不会调用它们。非常感谢您提供帮助解决此问题的建议。
这些是我添加代码以支持共享元素过渡的地方:
public class MyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.imageview) ImageView imageView;
private Item item;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setTag(this);
itemView.setOnClickListener(onItemClickListener);
}
@Override
public void onBind(int position) {
super.onBind(position);
this.item = list.get(position);
imageView.setTransitionName(item.getId());
Glide.with(imageView.getContext().getApplicationContext())
.load(item.getUrl())
.centerCrop()
.apply(RequestOptions.placeholderOf(new ColorDrawable(Color.BLACK)))
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView);
}
public Item getItem() {
return item;
}
}
public class MyActivity extends AppCompatActivity {
...
public void setUp() {
...
adapter.setOnItemClickListener(view -> {
MyViewHolder viewHolder = (MyViewHolder)view.getTag();
View view = viewHolder.imageView;
Intent intent = new Intent(this, DetailsActivity.class);
intent.putExtra(Item.TAG, viewHolder.getItem());
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
this,
view,
view.getTransitionName());
startActivity(intent, options.toBundle());
});
...
}
}
public class DetailsActivity extends AppCompatActivity {
@BindView(R.id.imageview) ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
supportPostponeEnterTransition();
Bundle bundle = getIntent().getExtras();
Item item = (Item) bundle.getSerializable(Item.TAG);
imageView.setTransitionName(item.getId());
final RequestListener<Drawable> requestListener = new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
supportStartPostponedEnterTransition();
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
supportStartPostponedEnterTransition();
return false;
}
};
Glide.with(getApplicationContext())
.load(item.getUrl())
.centerCrop()
.addListener(requestListener)
.into(imageView);
}
}
嗯,我相信这是从API中的API 29开始的错误>
共享元素过渡。它在API <29和Fragment-Fragment过渡中正常工作。
虽然从ActivityA
ActivityB
并从ActivityB
返回至ActivityA
,但是除非您在ActivityB]上,否则一切正常>并在后台或锁定设备屏幕上发送您的应用程序,然后您进入打开了[[ActivityB的应用程序,现在按返回按钮或返回到ActivityA会丢失所有共享元素的反向转换,即使您已覆盖sharedElementReturnTransition
我发现了一个简单的hack来解决此问题,这使得我们 过渡到无法正常工作-
将ActivityB
发送到后台时,它将调用该活动的
onPause() > onStop()
onStop()
您可以检查以下情况,如果活动尚未完成,并且您的API> 29,则在callActivityOnSaveInstanceState()
中传递当前的Bundle, 科林代码 //在您的ActivityB中覆盖此方法
override fun onStop() {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q && !isFinishing) {
Instrumentation().callActivityOnSaveInstanceState(this, Bundle())
}
super.onStop()
}
希望对您有帮助!