Как добавить LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES в параметры оконного менеджера? - PullRequest
1 голос
/ 13 октября 2019

Я создаю приложение для 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);
    

    Используя вышеописанные методы, я могу показать мой вид поверх других приложений. Но проблема в том, что мой взгляд не перекрывается с вырезом дисплея. Это происходит, когда Android находится в ландшафтном режиме.

Решение:

Я решил эту проблему, просто добавив следующую строку кода (как предложено в Ответе):

     params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;

1 Ответ

2 голосов
/ 13 октября 2019

Попробуйте установить в вашем Activity:

window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
...