Переход общего элемента с RecyclerView к фрагменту - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть RecyclerView внутри Fragment, который принадлежит ViewPager.Я пытаюсь установить Transition на секунду Fragment при нажатии на элемент внутри ViewPager.Я чувствую, что исчерпал ресурсы для других подобных вопросов, которые были заданы, и попытался найти их решение безрезультатно.

У меня нет проблем, просто выполняя любой другой переход;это SharedElementTransition, что я не могу работать.Любая помощь будет принята с благодарностью.

Я устанавливаю TransitionName каждого отдельного элемента в методе onBindViewHolder, и я вызываю postponeEnterTransition в onCreate моей цели Fragment, пока все Views созданы.Всякий раз, когда я нажимаю на элемент в RecyclerView, я, кажется, полностью пропускаю анимацию и прыгаю прямо к финальному фрагменту View.

My RecyclerAdapter:

@Override
public void onBindViewHolder(@NonNull final GroupRecyclerAdapter.GroupViewHolder viewHolder, int position) {
    if(groupsList !=null){
        final GroupBase currentGroup = groupsList.get(position);

        ViewCompat.setTransitionName(viewHolder.nameTxt,"transition"+position);
        viewHolder.nameTxt.setText(currentGroup.getName());
        //viewHolder.nameTxt.setTransitionName("Transition"+position);
        Log.i(TAG,"New ViewHolder with TransitionName: "+ viewHolder.nameTxt.getTransitionName());

        viewHolder.descTxt.setText(currentGroup.getDescription());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                groupClickListener.onGroupClick(viewHolder.getAdapterPosition(), currentGroup, viewHolder.nameTxt);
            }
        });
    }
}

содержащий RecyclerView:

@Override
public void onGroupClick(int position, GroupBase groupBase, View sharedView) {
    Log.i(TAG,"Clicked on a Group View with TransitionName: "+sharedView.getTransitionName());
    Fragment detailedGroup = Detailed_Group_Fragment.newInstance(groupBase,
            sharedView.getTransitionName());
    detailedGroup.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
    //detailedGroup.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade));

    Log.i(TAG,"TRANSITION NAME OF Recycler TextView : "+ sharedView.getTransitionName());
    getFragmentManager()
            .beginTransaction()
            .addSharedElement(sharedView, "transition")
            .replace(R.id.core_frame,detailedGroup)
            .addToBackStack(null)
            .commit();
}

Моя цель Fragment:

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

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

    final GroupBase groupBase = getArguments().getParcelable(GROUP_BASE);
    String transitionName = getArguments().getString(TRANSITION_NAME);
    Log.i(TAG,"TransitionName variable in detail is: "+transitionName);
    TextView name = view.findViewById(R.id.detail_group_name_txt);
    name.setText(groupBase.getName());
    //name.setTransitionName(transitionName);
    ViewCompat.setTransitionName(name,"transition");

    startPostponedEnterTransition();
}

Ни у одного из моих представлений не установлено TransitionName в файле .xml, и все отображается так, как ожидалось.

РЕДАКТИРОВАТЬ

Из дальнейшего исследования, кажется, возникает проблема, когда я пытаюсь выполнить FragmentTransactions для загрузки нового Fragment из ViewPager,Согласно этому предложению , в моем ViewPager хосте Activity я звоню postponeEnterTransition(), а также реализовал interface, который вызывается, когда мои целевые Fragment представления были созданы.Однако при переходе от ViewPager Fragment к цели Fragment.

Host Activity:

public class Core_Activity extends AppCompatActivity implements
View.OnClickListener, Detailed_Group_Fragment.TransitionScheduler {
private static final String TAG = "Core_Activity";
private ViewPager viewPager;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    postponeEnterTransition();
    ...
}
...

public void scheduleStartTransition(final View sharedView){
    sharedView.getViewTreeObserver().addOnPreDrawListener(
            new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    Log.i(TAG,"The sharedView called onPreDraw.");
                    sharedView.getViewTreeObserver()
                        .removeOnPreDrawListener(this);
                    startPostponedEnterTransition();
                    return true;
                }
            }
    );
}

Моя пересмотренная цель * 1060 нет изменений.*:

public class Detailed_Group_Fragment extends Fragment {
private static final String TAG = "Detailed_Group_Fragment";
private static final String TRANSITION_NAME = "transition_name";
private static final String GROUP_BASE = "group_base";

TransitionScheduler transitionScheduler;
public interface TransitionScheduler{
    void scheduleStartTransition(View sharedView);
}

public static Detailed_Group_Fragment newInstance(GroupBase groupBase, String transitionName){
    Detailed_Group_Fragment detailed_group_fragment = new Detailed_Group_Fragment();
    Bundle bundle = new Bundle();
    bundle.putParcelable(GROUP_BASE, groupBase);
    bundle.putString(TRANSITION_NAME,transitionName);
    detailed_group_fragment.setArguments(bundle);
    return detailed_group_fragment;
}
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    final GroupBase groupBase = getArguments().getParcelable(GROUP_BASE);
    String transitionName = getArguments().getString(TRANSITION_NAME);

    final TextView name = view.findViewById(R.id.detail_group_name_txt);

    name.setText(transitionName);
    name.setTransitionName("hungry");
    transitionScheduler.scheduleStartTransition(name);

    TextView desc = view.findViewById(R.id.group_desc_txt);
    desc.setText(groupBase.getDescription());

    final ImageView image = view.findViewById(R.id.group_image);
    if(groupBase.getImageURI()!=null && groupBase.getBytes()==null){
        Log.i(TAG,"Fetching the photo for this group.");
        mGroupViewModel.getImage(groupBase.getImageURI())
                .addOnSuccessListener(new OnSuccessListener<byte[]>() {
                    @Override
                    public void onSuccess(byte[] bytes) {
                        groupBase.setBytes(bytes);
                        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                        image.setImageBitmap(bitmap);

                    }
                });
    }
    if(groupBase.getBytes()!=null){
        Bitmap bitmap = BitmapFactory.decodeByteArray(groupBase.getBytes(),0,groupBase.getBytes().length);
        image.setImageBitmap(bitmap);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try{
        //We need to get an instance of the Class that will execute our interface method.
        transitionScheduler = (TransitionScheduler) getActivity();
    } catch (ClassCastException e) {
        Log.e(TAG,"Class cast exception." + e.getMessage());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...