Панель навигации переполненных элементов переполнения в анимации перехода

В то время как действия передают один на другой, разделяемые элементы, которые размещают на экране в новом действии, накладывают навигационную панель, как показано на рисунке Панель перекрытия общих элементов

Также вы можете увидеть эту ошибку в панели навигации оверлея видео

Solutions Collecting From Web of "Панель навигации переполненных элементов переполнения в анимации перехода"

(1) Отключите наложение, установив
android:windowSharedElementsUseOverlay="false" в вашем XML. При отключении общие элементы будут отображаться как часть иерархии представлений вызываемой активности, что делает невозможным случайное перекрытие разделяемых элементов поверх панелей пользовательского интерфейса системы.
К сожалению, отключение этого поведения может привести к появлению новых проблем …
Например, вы можете обнаружить, что не-общие представления в любой из операций начинают обрезать общие элементы по мере их перехода на место. В большинстве случаев вы можете предотвратить это, установив android:cliptoChildren="false" и "android:clipToPadding="false" для каждого родителя общего элемента в вашем XML, хотя в зависимости от конкретного "android:clipToPadding="false" использования может потребоваться дополнительная настройка.
(2) Добавьте панель действий, фона строки состояния и фона панели навигации в качестве дополнительных разделяемых элементов
Создав общие элементы системных брандмауэров, вы можете убедиться, что как исходные общие элементы, так и системный пользовательский интерфейс нарисованы на одном уровне поверх остальных иерархии представления окна. Чтобы получить ссылку на эти представления, вы можете использовать следующий код:

View decor = getWindow().getDecorView();
View statusBar = decor.findViewById(android.R.id.statusBarBackground);
View navBar = decor.findViewById(android.R.id.navigationBarBackground);
View actionBar = decor.findViewById(getResources().getIdentifier("action_bar_container", "id", "android"));

Вы можете сослаться на это, чтобы обсудить это сообщение

Я обнаружил, что это ошибка Android, когда вы используете

 <item name="android:windowDrawsSystemBarBackgrounds">true</item> 

В теме деятельности.

Но он должен установить цвет в строку состояния, поэтому я не могу установить его в false. В противном случае этот флаг можно установить во время выполнения через

 if (Build.VERSION.SDK_INT >= 21) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); } 

Также вы можете очистить этот флаг с clearFlags метода clearFlags Window .

Затем я очищаю этот флаг перед началом анимации перехода во второй активности и добавляю этот флаг после завершения перехода. Это нужно делать только в вызываемой деятельности.

ОБНОВИТЬ

Я нашел лучшее решение. В Android каждый общий вид элементов рисуется поверх представления декора. Фон панели навигации обычно располагается поверх представления декора. Но в переходное время общие элементы лежали выше.

Возможно, navigationBarBackground вид добавляет к getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground) элементам, доступным из getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground) . Для этого вам нужно добавить его к общим элементам в активности вызова и добавить их к общим элементам в вызываемой активности.

Есть одна проблема. Вам нужно подождать, когда навигационный фон будет прикреплен к представлению декора. Это пример того, как решить эту проблему в onCreate() в вызываемой активности

 ActivityCompat.postponeEnterTransition(this); final View decorView = getWindow().getDecorView(); decorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { decorView.removeOnLayoutChangeListener(this); View navigationBarBackground = getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground); if (navigationBarBackground != null) { android.support.v4.view.ViewCompat.setTransitionName(navigationBarBackground, "navigationBg"); } ActivityCompat.startPostponedEnterTransition(MyActivity.this); } }); 

Если вы используете переход SharedElement, вы можете отключить переход по умолчанию, который является затуханием, вызывая:

 getWindow().setEnterTransition(null); 

Это также решит проблему, когда общий элемент находится за панель состояния, и при запуске анимации происходит сбой.