Как добавить LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES в параметры оконного менеджера?
Я создаю приложение для Android, в котором я показываю плавающее представление поверх всех приложений с помощью службы и диспетчера окон. Я пытаюсь добавить WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES в свои параметры оконного менеджера, чтобы мой макет мог перекрываться с вырезами дисплея. Но похоже, что в моем случае это не работает.
Я уже пробовал добавить оба способа:
Используя стили XML:
<style name="OverlayTheme"> <item name="android:windowLayoutInDisplayCutoutMode"> shortEdges <!-- default, shortEdges, never --> </item> </style>
И добавил этот стиль в корневой вид моего макета. Но это не работает.
Используя код JAVA в моем сервисе:
params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT);
Это тоже не работает. Я не уверен, правильно ли я применяю параметры макета. Пожалуйста, помогите мне разобраться в проблеме. Заранее спасибо.
Редактировать:
Вот как я реализовал пузырь в своем сервисе:
Инициализированный оконный менеджер и макет в методе onCreate():
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (inflater != null) mLayout = inflater.inflate(R.layout.my_layout, null, false);
Добавлен этот вид в окно диспетчером окон:
WindowManager.LayoutParams params; params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT);
Наконец, добавили это представление в Window с помощью метода addView:
windowManager.addView(mLayout, params);
Используя вышеуказанные методы, я могу показать свое мнение поверх других приложений. Но проблема в том, что мой взгляд не совпадает с вырезом на дисплее. Это происходит, когда андроид находится в ландшафтном режиме.
Решение:
Я решил это, просто добавив эту строку кода (как предлагается в Answere):
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
1 ответ
Попробуйте установить в своем Activity
:
window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES