Я работаю над реализацией базовой c 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);
}
}