Я создаю приложение для 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);
Используя вышеописанные методы, я могу показать мой вид поверх других приложений. Но проблема в том, что мой взгляд не перекрывается с вырезом дисплея. Это происходит, когда Android находится в ландшафтном режиме.
Решение:
Я решил эту проблему, просто добавив следующую строку кода (как предложено в Ответе):
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;