【问题标题】:Return to Activity with correct Transition or without Shared Element Transition使用正确的转换或没有共享元素转换返回到 Activity
【发布时间】:2018-03-14 23:49:46
【问题描述】:

我使用this 指南制作了一个简单的 RecyclerView(在片段中)到具有多个元素的 Activity 共享元素转换,这一切都很好地解决了我想要返回的点。虽然我通过 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);
    }

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

所以,我正在尝试一种方法,要么使返回过渡正常工作,这意味着“褪色”效果在正确的项目上褪色,或者一起删除返回过渡。

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

【问题讨论】:

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


    【解决方案1】:

    尝试在没有super.onBackPressed() 的情况下调用finish()

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

    【讨论】:

      【解决方案2】:

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

      您希望在每个 ViewHolder 上设置唯一的 transitionNames。考虑将adapterPosition 连接到视图的transitionName,然后将该位置作为额外的传递给您调用的活动,该活动将其视图的transitionName 设置为该位置值。

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多