Android очищает анимацию перехода из общего элемента в активность после выхода после нажатия кнопки питания - PullRequest
0 голосов
/ 27 марта 2020

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

    }
}

...