Вернуться к действию с правильным переходом или без перехода общего элемента

я использовал это руководство, чтобы сделать простой RecyclerView (в фрагменте) to Activity Shared Element Transition с несколькими элементами, и все это отлично работало до того момента, когда я пытаюсь вернуться. Хотя я передаю ViewHolder, как показано ниже, иногда анимация возврата заканчивается на другом элементе RecyclerView, что действительно плохо.

 public void onPetClicked(PetRecyclerViewAdapter.PetViewHolder holder, int position) {

            Intent newPostIntent = new Intent(getActivity(), PostDetailsActivity.class);
            newPostIntent.putExtra("TYPE", mPostType);
            newPostIntent.putExtra("POSTED_PET",  mPetList.get(position));

            Pair<View, String> area = Pair.create(holder.itemView.findViewById(R.id.removable), "content_area");
            Pair<View, String> p1 = Pair.create(holder.itemView.findViewById(R.id.ivPetImage), "petImage");
            Pair<View, String> p2 = Pair.create(holder.itemView.findViewById(R.id.tvTitle), "postTitle");
            Pair<View, String> p3 = Pair.create(holder.itemView.findViewById(R.id.tvInfo), "postDescription");
            Pair<View, String> p4 = Pair.create(holder.itemView.findViewById(R.id.rlDate), "postDate");
            Pair<View, String> p5 = Pair.create(holder.itemView.findViewById(R.id.rlLocation), "postLocation");
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(getActivity(), area, p1, p2, p3, p4,p5);

            getActivity().startActivity(newPostIntent, options.toBundle());

Не имея возможности исправить это, я решил фактически не использовать анимацию возврата, поэтому во втором упражнении я заменил

 @Override
    public void onBackPressed(){
        super.onBackPressed();
        supportFinishAfterTransition();
    }

с участием

@Override
    public void onBackPressed(){
        super.onBackPressed();
         finish();
         overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    }

но теперь, когда я возвращаюсь, все общие элементы пусты!

Итак, я пытаюсь придумать способ: либо заставить возвратный переход работать должным образом, то есть «затухающие» эффекты исчезают на правильном элементе, ИЛИ удалить возвратный переход все вместе.

Изменить: чтобы заставить его работать, я попытался получить и использовать View, который был нажат, вместо ViewHolder, но опять же, я получил те же результаты. Как только я прокручивал представление ресайклера и открывал элемент, представления возвращались к строке, отличной от той, которую они начали.

 public void onPetClicked(View view, PetRecyclerViewAdapter.PetViewHolder holder, int position) {
            mPetList.get(position);

            Intent newPostIntent = new Intent(getActivity(), PostDetailsActivity.class);
            newPostIntent.putExtra("TYPE", mPostType);
            newPostIntent.putExtra("POSTED_PET",  mPetList.get(position));

            Pair<View, String> area = Pair.create(view.findViewById(R.id.removable), "content_area");
            Pair<View, String> p1 = Pair.create(view.findViewById(R.id.ivPetImage), "petImage");
            Pair<View, String> p2 = Pair.create(view.findViewById(R.id.tvTitle), "postTitle");
            Pair<View, String> p3 = Pair.create(view.findViewById(R.id.tvInfo), "postDescription");
            Pair<View, String> p4 = Pair.create(view.findViewById(R.id.rlDate), "postDate");
            Pair<View, String> p5 = Pair.create(view.findViewById(R.id.rlLocation), "postLocation");
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(getActivity(), area, p1, p2, p3, p4,p5);

            getActivity().startActivity(newPostIntent, options.toBundle());
        }
    });

person Nikiforos    schedule 05.12.2016    source источник


Ответы (2)


Попробуйте позвонить finish() без super.onBackPressed().

Я предполагаю, что ваша активность - это AppCompatActivity? Перед завершением он выполнит ожидающий переход.

person Flo We    schedule 04.05.2017

То, как вы устанавливаете transitionName в общих парах элементов, работать не будет. Когда вы вернетесь к вызывающему Activity, система ищет уникальное представление с этими именами переходов, но не находит его. Вам нужно на самом деле вызвать setTransitionName в ваших общих представлениях.

Вы хотите установить уникальные transitionNames для каждого ViewHolder. Подумайте о конкатенации adapterPosition с именем перехода представления, а затем передайте эту позицию в качестве дополнения к вызываемой вами Activity, которая устанавливает transitionName для своих представлений с этим значением позиции.

person mp501    schedule 14.03.2018