Как добавить LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES в параметры оконного менеджера?

Я создаю приложение для Android, в котором я показываю плавающее представление поверх всех приложений с помощью службы и диспетчера окон. Я пытаюсь добавить WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES в свои параметры оконного менеджера, чтобы мой макет мог перекрываться с вырезами дисплея. Но похоже, что в моем случае это не работает.

Я уже пробовал добавить оба способа:

  1. Используя стили XML:

    <style name="OverlayTheme">
      <item name="android:windowLayoutInDisplayCutoutMode">
        shortEdges <!-- default, shortEdges, never -->
      </item>
    </style>
    

    И добавил этот стиль в корневой вид моего макета. Но это не работает.

  2. Используя код 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);
    

    Это тоже не работает. Я не уверен, правильно ли я применяю параметры макета. Пожалуйста, помогите мне разобраться в проблеме. Заранее спасибо.

Редактировать:

Вот как я реализовал пузырь в своем сервисе:

  1. Инициализированный оконный менеджер и макет в методе 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); 
    
  2. Добавлен этот вид в окно диспетчером окон:

    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);
    
  3. Наконец, добавили это представление в 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
Другие вопросы по тегам