Тот же тип фрагмента Общий переход не работает - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь добавить общие переходы в свое приложение. У меня есть два фрагмента: A и B.

Первые переходы (Enter и Exit) от A до B работают правильно, транзакция фрагмента обоих этих фрагментов:

// Fragment A, this is the first fragment to load.
getActivity()
    .getSupportFragmentManager()
    .beginTransaction()
    .setReorderingAllowed(true)
    .replace(R.layout.fragment_container, fragmentA)
    .addToBackStack(null)
    .commit();

Нажмите на за одним из ViewHolder s из RecyclerView в Fragment A следует следующая транзакция

// Fragment B, this is the first fragment to load.
FragmentTransaction ft = getActivity()
            .getSupportFragmentManager()
            .beginTransaction()
            .setReorderingAllowed(true);

    Map<String, View> sharedElements = previousFragment.getSharedElements();
    if (sharedElements != null) {
        for (Map.Entry<String, View> sharedElement : sharedElements.entrySet()) {
            ft.addSharedElement(sharedElement.getValue(), sharedElement.getKey());
        }
    }

    ft
            .replace(R.layout.fragment_container, fragmentB)
            .addToBackStack(null)
            .commit();

в методе onViewCreated() фрагмента B, который у меня есть:

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

    prepareTransition();
    postponeEnterTransition();    // Later I'm calling startPostponedEnterTransition() from a Glide callback.
}

private void prepareTransition() {
    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

            for (String transitionName : names) {
                if (transitionName.equalsIgnoreCase(getString(R.string.transitionName_moviePoster))) {
                    if (mSelectedSuggestionMovieItemIndex != -1) {
                        MovieItemViewHolder movieItemViewHolder = (MovieItemViewHolder) movieDetailsSuggestionsList.findViewHolderForAdapterPosition(mSelectedSuggestionMovieItemIndex);

                        if (movieItemViewHolder != null) {
                            movieItemViewHolder.moviePoster.setTransitionName(transitionName);
                            sharedElements.put(transitionName,
                                    movieItemViewHolder.moviePoster);
                        }
                    }
                }
                else if (transitionName.equalsIgnoreCase(getString(R.string.transitionName_movieTitle))) {
                    if (mSelectedSuggestionMovieItemIndex != -1) {
                        MovieItemViewHolder movieItemViewHolder = (MovieItemViewHolder) movieDetailsSuggestionsList.findViewHolderForAdapterPosition(mSelectedSuggestionMovieItemIndex);

                        if (movieItemViewHolder != null) {
                            movieItemViewHolder.movieTitle.setTransitionName(transitionName);
                            sharedElements.put(transitionName, movieItemViewHolder.movieTitle);
                        }
                    }
                }
            }
        }
    });

    Fade fadeTransition = new Fade();
    fadeTransition.setInterpolator(new DecelerateInterpolator(1.5f));

    fadeTransition.setDuration(getResources().getInteger(R.integer.details_fragment_transition_duration));
    // Setup enter transition on destination fragment
    setEnterTransition(fadeTransition);
    setSharedElementEnterTransition(TransitionInflater.from(getActivity())
            .inflateTransition(R.transition.movie_poster_transition));

    //  Setup exit transition on destination fragment.
    setExitTransition(fadeTransition);
    setSharedElementReturnTransition(TransitionInflater.from(getActivity())
            .inflateTransition(R.transition.movie_details_exit_transition));
}

Однако второй общий переход (вход и выход) от фрагмента B к новому экземпляру фрагмента B не работает.

Во время отладки я убедился, что правильные представления передаются во время перехода и отображаются в onMapSharedElements() обратный вызов для обратных вызовов Enter и Exit.

...