Повністю запобігати переходам Activity від втручання у спільні переходи елементів:
По завершенню активності викличте getWindow (). SetExitTransition (null);
У процесі введення викличте getWindow (). SetEnterTransition (null);
З https://stackoverflow.com/a/34907685/967131
Я підозрюю, що це може мати побічні ефекти, але не знаю точно. Це просто по-справжньому і працює.
Запобігання мигання конкретних елементів:
Я почав з Алекса Локвуда і провів численні експерименти, щоб спробувати змусити його працювати. Його суть правильна, хоча мені не потрібен був код, який він пропонує для отримання Activity, але я зіткнувся з деякими проблемами, викликавши його у фрагменті (замість Activity) і встановивши панель інструментів як панель дій.
О, Фрагмент? Я бачив багато коментарів про те, що спроби отримати посилання на рядок стану та панель навігації були нульовими. Те саме траплялося і зі мною, поки я не зрозумів, що не знайду тих, хто у макеті Фрагменту ... вони були вище цього рівня. Отже, наведений нижче код, щоб отримати вид декору з Діяльності та шукати це. Потім я знайшов їх без проблем.
Врешті-решт, я розробив такий метод корисності:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
Примітка R.string.transition_appbarlayout та R.id.appbarlayout . Ці ідентифікатори є довільними, якщо вони відповідають тому, що використовує ваш код. У своєму XML я розміщую спеціальну панель дій так (відредаговано до найнеобхіднішого):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
Якщо ви не використовуєте подібну панель інструментів, цю частину можна видалити із способу утиліти.
Тоді ви б назвали це у своєму Фрагменті так:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**))
Використовуйте будь-які потрібні вам значення, якщо вони відповідають вашому XML.
Це запобігає мигненню рядка стану, панелі інструментів та панелі навігації (кнопки назад / додому / останні програми) під час переходу. Решта переходу Діяльність є нормальним явищем.
У моєму випадку тема нашого додатку має android:windowBackground
синій колір. Це спричиняє синій спалах при переході, що дуже засмучує. Але замість того, щоб вносити зміни, які впливають на весь додаток так, наразі я піду з першим, швидким і брудним варіантом.