Я использую устройство под управлением 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 и переход сработал (ничего не меняя в коде)! До сих пор без понятия, что происходит...
Итак, мой последний вопрос: как объяснить такое поведение и есть ли способ заставить его работать без использования трюков?