SystemUIDialog 小结

有时我们为android系统SystemUI部分添加功能的时候,需要弹出一个Dialog来通知用户,但是SystenUI中的大部分类虽然提供了Context,但是却没有绑定相应的Activity。虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity.一般的Toast可以正常创建,但是如果需要创建AlertDialog的话在最后AlertDialog.show()会报出 Unable to add window – token null is not for an application 这个错误,这个错误正式因为作为构造参数传进去的context没有绑定相应的Activity。
但是,我们的google大大非常友好的给我们提供了这个工具类 com.android.systemui.statusbar.phone.SystemUIDialog;
你可以在SystemUI/ 的任意地方(在我目前使用到所有SystemUI的子包下面都没有问题)new一个这个类的实例来进行AlertDialog的弹出。
让我们看看SystemUIDialog是如何解决这个问题的,首先SystemUIDialog继承了AlertDialog 然后在它的构造方法中首先调用AlertDialog的构造方法,

    public SystemUIDialog(Context context){
        super(context,R.style.Theme_SystemUI_Dialog);
        mContext = context;
        getWindow()
            .setType(WindowManager
            .LayoutParams.TYPE_STATUS_BAR_PANEL);
        getWindow()
            .addFlags(WindowManager
            .LayoutParams.FLAG_ALT_FOCUSABLE_IM 
            | WindowManager
            .LayoutParams
            .FLAG_SHOW_WHEN_LOCKED);
        WindowManager
        .LayoutParams attrs = getWindow().getAttributes();
        attrs.setTitle(getClass().getSimpleName()); 
        getWindow().setAttributes(attrs);
    }

之后用getWindow 获取当前的Window并且设定它的Type 并且添加了一些flag,之后将SystemUIDialog类名加入Window的attrs中.其实并不清楚具体为什么要这么做只是这么做确实可以将AlertDialog的绑定问题搞定

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值