【问题标题】:How to add LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES in Window Manager Params?如何在窗口管理器参数中添加 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES?
【发布时间】:2019-10-13 18:01:29
【问题描述】:

我正在创建一个 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 方法将此视图添加到 Window 中:

    windowManager.addView(mLayout, params);
    

    通过使用上述方法,我可以在其他应用程序之上显示我的视图。但问题是我的视图没有与显示切口重叠。当android处于横向模式时会发生这种情况。

解决方案:

我通过添加这行代码解决了这个问题(如 Answere 中所建议的):

     params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;

【问题讨论】:

    标签: android android-layout android-service android-windowmanager display-cutouts


    【解决方案1】:

    尝试在您的Activity 中设置:

    window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    

    【讨论】:

    • 感谢您的回复。但我目前正在服务中,没有任何活动,我正在使用 WindowManager.LayoutParams params 和 windowManager.addView(mLayout, params); 将我的视图设置在其他应用程序之上(如气泡);方法。我已经更新了我的问题中的方法,以便您更好地理解。因为我没有对 window 变量的引用,所以我不能这样实现它。如果我在某个地方错了,请告诉我...
    • 非常感谢。我设法通过设置 params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;按照你的建议,它奏效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2017-01-27
    相关资源
    最近更新 更多