片段+ sharedElement +新片段中的recycleview

问题描述

我想使用sharedElement通过recycleView项目单击添加片段。 我一步一步测试每个样本,但无法正常工作。除了图像是从页面顶部而不是项目位置输入的

这是recycleView项目:

<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/template_book_card"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
android:divider="@android:color/transparent"
android:dividerHeight="0.0px"
android:clipToPadding="false"
android:clipChildren="false"
app:cardElevation="10dp"
app:cardUseCompatPadding="false"
app:cardPreventCornerOverlap="false"
>
<ImageView
    android:id="@+id/discount_image"
    android:layout_width="135dp"
    android:layout_height="200dp"
    android:adjustViewBounds="true"
    android:src="@drawable/bookimage"
/>
<View
    android:layout_width="4dp"
    android:layout_height="200dp"
    android:layout_gravity="right"
    android:alpha="0.1"
    android:background="@drawable/right_side_book_effect"
    android:layout_marginRight="6dp"
    />
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|left">
    <TextView
        android:id="@+id/discount_price1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:fontFamily="@font/sansweb"
        android:text="150000"
        android:padding="2dp"
        android:background="@android:color/white"
        android:textColor="#000000"
        android:textSize="8sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    <TextView
        android:id="@+id/discount_price2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/discount_text_background"
        android:fontFamily="@font/sansweb"
        android:paddingStart="2dp"
        android:paddingEnd="2dp"
        android:text="-15%"
        android:visibility="gone"
        android:textColor="@color/primary_dark"
        android:textSize="8sp"
        app:layout_constraintBottom_toBottomOf="@+id/discount_price1"
        app:layout_constraintEnd_toStartOf="@+id/discount_price1"

        app:layout_constraintTop_toTopOf="@+id/discount_price1" />

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

recycleView的适配器onBindView中的代码,用于设置setTransitionName:

     String transitionName="transition_name_"+((ItemViewHolder) holder).getAdapterPosition();
     ViewCompat.setTransitionName(((ItemViewHolder) holder).image,transitionName);

这是项目点击侦听器:

        ProductItemClickListener productItemClickListener = new ProductItemClickListener() {
        @Override
        public void onClick(int position,ProductModel productModel,View itemview,int                     productId,String transitionName) {                    
            TestDetailFragment kittenDetails = TestDetailFragment.newInstance(productModel,transitionName);
            setSharedElementReturnTransition(TransitionInflater.from(getContext()).inflateTransition(R.transition.change_image_transform));
            setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
            kittenDetails.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
            kittenDetails.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                getChildFragmentManager()
                        .beginTransaction()
                        //.setReorderingallowed(true)
                        .addSharedElement(itemview,ViewCompat.getTransitionName(itemview))
                        .add(R.id.home_fragment_container,kittenDetails)
                        .addToBackStack("test")
                        .commit();
            }
        }

    };

这是第二个片段:

public class TestDetailFragment extends Fragment {
private static final String ARG_ParaM1 = "param1";
private static final String ARG_ParaM2 = "param2";
private ProductModel productModel;
private String transitionName;

public TestDetailFragment() {
    // required empty public constructor
}
public static TestDetailFragment newInstance(ProductModel param1,String param2) {
    TestDetailFragment fragment = new TestDetailFragment();
    Bundle args = new Bundle();
    args.putSerializable(ARG_ParaM1,param1);
    args.putString(ARG_ParaM2,param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_test_detail,container,false);
}

@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
    super.onViewCreated(view,savedInstanceState);

    productModel =(ProductModel) getArguments().getSerializable(ARG_ParaM1);
     transitionName = getArguments().getString(ARG_ParaM2);


    //postponeEnterTransition();
    ImageView imageView = (ImageView) view.findViewById(R.id.image_);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        imageView.setTransitionName(transitionName);
        //ViewCompat.setTransitionName(imageView,transitionName);
    }
}
}

第二个片段视图与recycleview项目完全相同

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)