Проблемы с переходом Fragment enter

Я использую устройство под управлением Android 5.0, minSdk — 21, а targetSdk — 22.

Описание приложения

Я нахожусь в приложении с двумя действиями, действие A содержит GridView с изображениями и текстом, а действие B содержит одно ImageView, одно TextView и фрагмент. Этот фрагмент содержит список изображений, связанных с текстом. При нажатии на изображение действия A происходит переход общего элемента, который перемещает изображение и текст в ImageView и TextView действия B. Я также установил плавный переход между действием A и B. Фрагмент динамически добавляется в активность B в методе onCreate(). Я устанавливаю и вхожу и выхожу из перехода к фрагменту:

 MyFragment myFragment = new MyFragment();
 myFragment.setEnterTransition(new Slide());
 myFragment.setExitTransition(new Slide);
 getFragmentManager().beginTransaction()
                .add(R.id.container, myFragment, MyFragment.TAG)
                .commit();

По поводу перехода выхода из фрагмента я использовал трюк, при нажатии кнопки «Назад» я заменяю фрагмент другим, чтобы заставить его:

@Override
public void onBackPressed() {
    if (myFragment.isVisible()) {
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new Fragment())
                .commit();
    }
    super.onBackPressed();
}

Тема моего приложения является дочерней по отношению к Theme.Material, поэтому я не определял

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

ни

<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>

(Я пробовал с, и это не имело значения).

Проблема с приложением

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

  • нет явно определенного перехода активности: нет перехода входа, фрагмент уже есть, когда воспроизводится переход общего элемента.
  • определить переход действия с помощью java в действии A и B: getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade()); Результат будет таким же, как и при отсутствии явного перехода действия.
  • определить переход активности с помощью XML: <item name="android:windowEnterTransition">@transition/fade</item> <item name="android:windowExitTransition">@transition/fade</item> В результате фрагмент войдет путем затухания, а Fragment.setEnterTransition() будет проигнорировано.
  • определить переход фрагмента ввода в XML: <item name="android:fragmentEnterTransition">@transition/fade</item> результат состоит в том, что он полностью игнорируется, все предыдущие случаи будут происходить одинаково.

Я пробовал другие вещи, чтобы заставить его работать так: myFragment.setAllowEnterTransitionOverlap(false);, но ничего... Я также пытался установить прослушиватель кликов на ImageView и добавлять фрагмент только при нажатии на изображение, и это сработало! Из этого я подумал, что может быть проблема во времени перехода фрагмента по сравнению с жизненным циклом активности, поэтому я попытался поместить код в метод onResume(), но все равно ничего.

Затем я попытался использовать метод postDelayed():

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
mImageView.postDelayed(new Runnable() {
            @Override
            public void run() {
         getFragmentManager().beginTransaction()
            .add(R.id.container, myFragment, MyFragment.TAG)
            .commit();
            }
        }, 1000);

и это тоже сработало!

Наконец я попытался добавить пустой фрагмент, а затем заменить его на myFragment:

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
                .add(R.id.container, new Fragment)
                .commit();
getFragmentManager().beginTransaction()
                .replace(R.id.container, myFragment, MyFragment.TAG)
                .commit();

Но все равно ничего...

Итак, теперь мне интересно, есть ли что-то, чего мне не хватает, чтобы заставить его работать без использования трюков... И дело в том, что я знаю, что это может работать, потому что я начал работать над приложением, может быть, 5 месяцев назад, и оно работало!! Так что я не знаю, что случилось, я не обновлял свою версию Android.

Дополнительная ошибка: это все еще касается перехода фрагмента. Перед тем, как создать приложение, как я описал ранее, я попробовал версию без перехода к общему элементу. И если я не установлю имя перехода на TextView действия B, у фрагмента никогда не будет перехода ввода. Но, как и раньше, если он установлен в методе onclicklistener, он будет работать. Я попробовал это на 2 устройствах под управлением Android 5.0.x, и переход не работал. Попробовал на устройстве с Android 5.1.1 и переход сработал (ничего не меняя в коде)! До сих пор без понятия, что происходит...

Итак, мой последний вопрос: как объяснить такое поведение и есть ли способ заставить его работать без использования трюков?


comment
Я думаю, что я застрял в подобной проблеме. Единственное отличие я застреваю в переходе выхода. Вы обошли решение этого?   -  person Udayaditya Barua    schedule 23.05.2016
comment
То же самое здесь, использование onCreate не является ответом для меня, потому что я добавляю некоторый переход слайдов в RecyclerView и круговое отображение в представлении. Моя проблема, когда у меня appbarLayout не работает enterTransition, если я его уберу, то он начинает работать. Вы не видели такого API с ошибками и очень плохо документированного.   -  person Thracian    schedule 26.10.2020


Ответы (2)


Вместо этого попробуйте добавить переходы входа и выхода для фрагмента в его OnCreate. Кажется, это сработало для меня.

person android.rookie    schedule 01.06.2017

Используйте setCustomAnimations из класса FragmentTransaction.

getFragmentManager().beginTransaction() .setCustomAnimations(R.id.inAnim, R.id.outAnim, R.id.inAnim, R.id.outAnim) .replace(R.id.container, myFragment, MyFragment.TAG) . совершить();

Таким образом, вы можете определить анимацию для каждого перехода.

person ElDuderino    schedule 01.06.2017
comment
Проголосовали против, потому что это старый способ сделать это. OP использует более новый Transition API. - person Justin; 13.10.2017