Как добавить 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. Наконец, добавил это представление в окно с помощью метода 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
person aspix    schedule 13.10.2019
comment
Спасибо за ответ. Но в настоящее время я нахожусь в службе, а не в какой-либо деятельности, и я устанавливаю свои представления поверх других приложений (например, пузыря), используя параметры WindowManager.LayoutParams и windowManager.addView(mLayout, params); метод. Я обновил метод в своем вопросе, чтобы вы могли лучше понять. Поскольку у меня нет ссылки на переменную окна, я не могу реализовать ее так. Подскажите, если я где-то ошибаюсь... - person Ankush; 13.10.2019
comment
Большое спасибо. Мне удалось это сделать, установив params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; как вы предложили, и это сработало. - person Ankush; 13.10.2019