Переходы общего элемента компонента навигации работают для ввода, но не для возврата назад
Я пытаюсь использовать общий элемент анимации между 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 (фрагмент с повторным просмотром)
Нам нужно позвонить
postponeEnterTransition();
так что переход будет отложенНастройте 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!!