【问题标题】:Keep Notification Area open on outside click在外部单击时保持通知区域打开
【发布时间】:2014-12-09 19:24:50
【问题描述】:

我正在尝试创建一个Dialog,它显示在NotificationArea 的顶部,并且与Dialog 交互不会关闭NotificationArea。说明我想要的一个很好的例子是 Play Store 上的BubbleUPNP 应用程序。

因此,当我单击标记的按钮时,会显示对话框,我可以同时与对话框和通知进行交互。

所以,我已经尝试过:

我创建了一个Notification 并在其中一个按钮上设置了一个PendingIntent

Intent volumeUpIntent = new Intent(context, NotificationButtonListener.class);
volumeUpIntent.setAction("setVolume");

PendingIntent pendingVolumeUpIntent = PendingIntent.getBroadcast(context, 0, volumeUpIntent, 0);
remoteView.setOnClickPendingIntent(R.id.volumeIBtn, pendingVolumeUpIntent);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(android.R.drawable.ic_media_play);
builder.setAutoCancel(false);
builder.setOngoing(true);
builder.setContentInfo(getResources().getText(R.string.drag_to_expand));
notification = builder.build();

mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notification.bigContentView = remoteView;
notification.priority = Notification.PRIORITY_MAX;
mNM.notify(1, notification);

然后我创建了一个BroadcastListener,它捕获Notification 的动作:

public static class NotificationButtonListener extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("setVolume")) {

            Intent volumeIntent = new Intent(context, VolumeActivity.class);
            volumeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(volumeIntent);    

        }

当我单击Notification 中的按钮时,主题为DialogActivity 会出现,但是当我尝试与Dialog 交互时,NotificationArea 会关闭。有什么建议,如何实现我的目标?

【问题讨论】:

  • 只是为了仔细检查问题出在哪里:当您的未决意图解析为广播时,通知区域应该保持打开状态。在您的情况下,如果没有对话框,这是否有效?因此,如果您不显示对话框,抽屉会保持打开状态?
  • 我打开通知,按下按钮,显示对话框,但它有点“低于”通知层,所以当我尝试与对话框交互时(单击通知区域外),通知区域崩溃.
  • 问题是如果您不显示对话框,通知区域是否保持打开状态。我想是这样的。可能您的对话会加强焦点,因此您的通知会被折叠。您可以尝试在对话框活动的布局上使用 android:focusable="false" 和 android:focusableInTouchMode="false" - 但这只是猜测。
  • 不,您没有正确理解最初的问题。当我显示对话框 NotificationArea 未折叠时,当我尝试与对话框交互时它会折叠。
  • 我真的认为你想要的行为是不可能的,IMO 这就是为什么addAction() 可以在通知以及自定义布局和PenginIntent 上使用。

标签: android


【解决方案1】:

听起来您需要使用 WindowManager 来添加您的控制视图。我认为您正在寻找的窗口类型是TYPE_SYSTEM_OVERLAY

WindowManagerWindowManager.LayoutParams

【讨论】:

  • 我查找了 BubbleUPNP,但他们没有使用 android.permission.SYSTEM_ALERT_WINDOW 权限,所以也许还有另一种我不知道的方法来实现这一点。
  • TYPE_SYSTEM_OVERLAY 不允许与视图上的元素进行交互,它只是将视图显示在所有内容之上。
【解决方案2】:

对话框(实际上是一个活动)必须被定义为非模态的,因此它允许点击背景而不是被关闭。您可以在super.onCreate(...) 之后和setContentView(...) 之前使用以下代码来实现这一点:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

请记住,您需要实现一些其他方式来关闭对话框。我会使用超时,只要发生操作(按下通知按钮,按下对话框内的任何内容)就会重置。

更多阅读: FLAG_NOT_TOUCH_MODAL, FLAG_WATCH_OUTSIDE_TOUCH

【讨论】:

  • 如果我在顶部有活动和对话主题活动,它可以工作。然后我可以在对话框和活动下进行交互,但在这种情况下 - 对话框位于通知下方,我无法将其置于其之上。
【解决方案3】:

对我有用的代码:

        alertDialogLayout = View.inflate(getApplicationContext(), R.layout.volume_dialog, null);    

        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);

        WindowManager.LayoutParams wmlp = new LayoutParams();
        wmlp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
        wmlp.width = dm.widthPixels / 5;
        wmlp.height = LayoutParams.WRAP_CONTENT;
        wmlp.y += 10;
        wmlp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
        wmlp.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL;
        wm.addView(alertDialogLayout, wmlp);

这会在所有打开的活动和通知区域的顶部显示视图,并允许我与视图的元素进行交互。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2019-03-30
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多