Переходы общего элемента компонента навигации работают для ввода, но не для возврата назад

Я пытаюсь использовать общий элемент анимации между 2 фрагментами, BlankFragment и BlankFragment2. BlankFragment имеет вид рециркулятора, а BlankFragment2 представляет собой экран сведений. Они делятся изображением, и я использую новый компонент навигации.

В BlankFragment я строю FragmentNavigator.Extras и передать дополнения на мой звонок navigate с именем перехода общего образа (так как это представление перерабатывающего устройства, и они должны быть уникальными),

В BlankFragment2 я получаю это имя, устанавливая его на свое изображение и устанавливая setSharedElementEnterTransition

В результате анимация ввода работает нормально, а выход / возврат - нет, я попытался установить их, а не устанавливать (потому что я считаю, что компонент навигации должен справиться с этим для меня), кто-нибудь может помочь?

MainActivity Navigation Setup

private void setNavigation() {
    navController = Navigation.findNavController(this, R.id.main_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController);
}

Кнопка возврата

@Override
public boolean onSupportNavigateUp() {
    return Navigation.findNavController(this, R.id.main_fragment).navigateUp()
        || super.onSupportNavigateUp();
}

BlankFragment OnClick

@Override
public void onClick(View view, int position) {

    NavController navController = Navigation.findNavController(recyclerView);

    FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder().addSharedElement(view, view.getTransitionName()).build();

    BlankFragmentDirections.ActionBlankFragmentToBlankFragment2 directions = BlankFragmentDirections.actionBlankFragmentToBlankFragment2(view.getTransitionName());

    navController.navigate(directions,extras);

}

BlankFragment2 onCreate с переходом возврата / выхода

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));

    setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.no_transition));

    setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));

    getFragmentArguments();

}

Метод получения аргументов

private void getFragmentArguments(){
    if (getArguments() != null){
        transitionName = BlankFragment2Args.fromBundle(getArguments()).getTransitionName();
        Log.d(TAG, "transition name " + transitionName);
    }
}

Установить имя перехода изображения

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    image = view.findViewById(R.id.image);
    image.setTransitionName(transitionName);
    text = view.findViewById(R.id.text);

}

0 ответов

Ява

Чтобы исправить обратный переход, используйте viewTreeObserver.addOnPreDrawListener

В BlankFragment (фрагмент с повторным просмотром)

  1. Нам нужно позвонить postponeEnterTransition(); так что переход будет отложен

  2. Настройте addOnPreDrawListener в recycleView следующим образом

    RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
    //setup for recycle view adapter 
    
    ViewTreeObserver viewTreeObserver = recyclerView.getViewTreeObserver();
    viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            startPostponedEnterTransition();
            return true;
        }
    });
    

Вот и все.

Перейдите по этой ссылке, чтобы получить дополнительную информацию о ViewTreeObserver, перейдите по этой ссылке

FIN!!