SystemUIDialog 小结

来源:互联网 发布:淘宝客推广怎么样 编辑:程序博客网 时间:2024/05/27 20:52

有时我们为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 0
原创粉丝点击