返回到具有正确转换或没有共享元素转换的活动

时间:2016-12-05 17:56:02

标签: android android-recyclerview android-viewholder shared-element-transition

我使用this指南将一个简单的RecyclerView(在一个片段中)制作成具有多个元素的活动共享元素转换,这一切都很正常,我试图回来。虽然如下所示我通过了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);
    }

但现在当我回去时,所有共享元素都是空的!

所以,我试图找到一种方法,要么让返回过渡正常工作,这意味着&#34;褪色&#34;效果淡入正确的项目,或者一起删除返回过渡。

编辑:在实际使其工作的方向上,我试图获取并使用被点击的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());
        }
    });

2 个答案:

答案 0 :(得分:2)

尝试在没有finish()的情况下致电super.onBackPressed()

我猜你的Activity是AppCompatActivity?它将在完成之前执行挂起的转换。

答案 1 :(得分:0)

您在共享元素中设置transitionName的方式对不起作用。当您返回到您的调用Activity时,系统正在查找具有这些转换名称的唯一视图,但它没有找到它。您需要在共享视图上实际调用setTransitionName

您希望在每个ViewHolder上设置唯一的transitionNames。考虑将adapterPosition连接到View的transitionName,然后将该位置作为额外内容传递给被调用的Activity,该Activity使用该位置值设置其Views的transitionName。