12

我有一个在窗口管理器上显示浮动视图的服务(使用 WINDOW_TYPE_ALERT 权限)。我能够显示它并执行操作。但是,我有两个具体问题:

  1. 关于浮动视图的实现
  2. 如何收听系统后退按钮事件以便我可以关闭视图。

执行:

在清单中,我添加了以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

我有一个广播接收器,它将监听警报事件。收到事件后,我将启动一项服务来显示浮动视图。以下是我用来创建视图的代码。

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

每当用户对视图执行任何操作时,我都会从窗口管理器中删除视图并终止服务。

我想知道的是-如果这是解决问题的正确方法还是有更好的方法来解决?而且,我应该对 LayoutParams 进行更改还是保持原样?

其次,当有 SYSTEM BACK/HARDWARE BACK 按钮按下事件时,我还想关闭这个浮动视图。有关如何执行此操作的任何指示都会有所帮助。

附上浮动视图的屏幕截图以便更好地理解:

浮动视图

4

5 回答 5

11

在后退按钮检测方面 - 我让它以下列方式工作(一切都发生在服务 onCreate 代码中):

  1. 将您想要的视图包装到 ViewGroup 中(LinearLayout、Relative 或其他)
  2. 在包装视图中像这样覆盖 dispatchKeyEvent :

mView = new RelativeLayout(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
                // < your action >
                return true;
            }
            return super.dispatchKeyEvent(event);
        }
};
  1. 将包装视图添加到窗口管理器,并确保 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 未在包装布局参数上设置。
于 2014-09-15T10:54:17.707 回答
6

看看Standout Library ,它对处理浮动窗口很有用,它似乎也没有处理后按事件,联系开发人员可能会有所帮助。

另一种方法是您可以尝试使用半透明背景/主题打开活动,以获得在 Any.do 中浮动窗口中使用的类似效果,并且可以处理 backpress 事件

于 2013-09-04T13:29:58.807 回答
2

关于后退按钮 - 您应该覆盖视图中的“onBackPressed()”并做任何您想做的事情

@Override
public boolean onBackPressed() {
    // Remove your view from the window...
}

无论如何,我正在使用一个名为 Tooleap 的 SDK,以直接的方式显示浮动窗口。

于 2014-06-23T09:11:06.420 回答
1

您是否希望 HOME 按钮也关闭您的 UI?如果你这样做了,听起来最好有一个在透明背景上打开的活动,而不是一个警报窗口。为此,请使用以下样式作为活动的主题

<style name="Transparent">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowFullscreen">true</item>
</style>
于 2013-09-06T08:35:48.297 回答
-1

对于工作“onBackpressed”按钮,请遵循以下说明

1.转到示例中的 FlotingFolder.java 文件(不是库)。

2.找到下面的方法

@Override
public int getFlags(int id) {
    if (APP_SELECTOR_ID == id) {
        return super.getFlags(id);
    } else {
        return super.getFlags(id) | StandOutFlags.FLAG_BODY_MOVE_ENABLE
                | StandOutFlags.FLAG_WINDOW_EDGE_LIMITS_ENABLE
                | StandOutFlags.FLAG_WINDOW_FOCUSABLE_DISABLE;
    }
}
  1. 然后从上述方法中删除-“StandOutFlags.FLAG_WINDOW_FOCUSABLE_DISABLE”

现在 onBackPressed 将起作用。

于 2015-04-01T06:45:04.817 回答