анимация от фрагмента к фрагменту с общим элементом не работает должным образом - PullRequest
0 голосов
/ 06 ноября 2018

В AppCompatActivity с RecyclerView во фрагменте (myFragment1), viewholders и т. Д., Поэтому, если я нажму на элемент, то myFragment2 отобразит и отобразит детали элемента , На этом этапе я хочу создать анимацию между двумя фрагментами с общими элементами.
Шаги для воспроизведения поведения:

import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
[...]
public class AppActivity extends AppCompatActivity

myFragment1.setSharedElementReturnTransition(new MyNewTransition());
myFragment1.setSharedElementEnterTransition(new MyNewTransition());
[...]
a) getSupportFragmentManager().beginTransaction()
                    .addSharedElement(myImage, "mytransition")
                    .replace(R.id.recycler_view_container, myFragment2)
                    .commit();

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

В (a) коде изображение правильно передается, и анимация происходит идеально между общими элементами, но мне это не нужно. В коде (b) единственное отличие состоит в том, что myFragment1 скрыт и добавлен myFragment2, в этом случае и ввод, и возврат возвращаются, и анимация не происходит.
Мне нужен код (b), потому что «замена» фрагментов разрушит myFragment1, а его восстановление - это процесс с большой нагрузкой. Я думаю, что это ошибка с библиотеками androidx

EDIT: Я построил образец, основанный на демонстрации Брайана Хербста:
FragmentTransitionSample и повторно адаптирован для androidx, здесь являются источниками.

1 Ответ

0 голосов
/ 01 января 2019

Попробуйте добавить setReorderingAllowed(true)

Например:

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