Я пытаюсь добавить общие переходы в свое приложение. У меня есть два фрагмента: 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.