Фрагментировать переход общего элемента с помощью add() вместо replace()?

Я пытаюсь сделать переход общего элемента между фрагментами, все работает нормально при использовании replace() для добавления второго фрагмента, однако в кодовой базе часто используется add(), но при этом переход просто переходит к конечным значениям

Возможен ли переход между добавленными фрагментами? Спасибо.

@Override
public void onClick(View v) {
    setSharedElementReturnTransition(TransitionInflater.from(getActivity())
        .inflateTransition(android.R.transition.move));

    FragmentB secondFragment = new FragmentB();
    secondFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity())
        .inflateTransition(android.R.transition.move));

    getFragmentManager().beginTransaction()
        .add(R.id.container, secondFragment)
        .addToBackStack(null)
        .addSharedElement(imageView, imageView.getTransitionName())
        .commit();
}

person urSus    schedule 25.03.2015    source источник
comment
Другой фрагмент, который вы используете, является дочерним фрагментом?   -  person Neelay Srivastava    schedule 01.10.2016


Ответы (3)


поскольку система не проходит через onPause из первого фрагмента, этого не произойдет. потому что, когда вы добавляете новый фрагмент, новый фрагмент появляется поверх старого фрагмента.

но вы можете подделать его, хотя у вас будет больше кода!

ниже есть образец:

https://github.com/Kisty/FragmentTransitionExample

и видео, не относящееся к делу полностью, но помогающее вам понять идею:

https://www.youtube.com/watch?v=CPxkoe2MraA

person Amir Ziarati    schedule 02.10.2016
comment
Этот хак, кажется, работает для ImageViews, но это немного сложно, если представление само по себе является группой просмотра. - person Rohit; 27.10.2020

Попробуйте добавить метод .detach() для FragmentTransaction.

    FragmentManager manager = activity.getSupportFragmentManager ();
    Fragment currentFragment = manager.findFragmentById (CONTAINER_ID); 
    int intoContainerId = currentFragment.getId ();
    manager.beginTransaction ()
            .setTransition (FragmentTransaction.TRANSIT_FRAGMENT_FADE)
            .addSharedElement(view, transitionName)
            .addToBackStack (withTag)
            .detach(currentFragment)
            .add(intoContainerId, newFragment, withTag)
            .commit();
person Alexander Korovin    schedule 14.02.2019
comment
это заставляет представление в фоновом режиме выходить из пользовательского интерфейса, что уничтожает всю цель добавления фрагмента вместо его замены в первую очередь. - person Rohit; 27.10.2020

Попробуй это

getSupportFragmentManager().beginTransaction() 
                .addSharedElement(myImage, "mytransition") 
                .add(R.id.recycler_view_container, myFragment2) 
                .hide(myFragment1)  
                 commit(); 

работал на меня

person ams92    schedule 24.03.2021