如何以编程方式更改 WindowManager.LayoutParams' 类型?

How to change the WindowManager.LayoutParams' type programmatically?

我得到了可以在锁屏上显示的视图。但我想让它成为可选的。目前我使用这些参数来实现这一点:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT, 
WindowManager.LayoutParams.WRAP_CONTENT, 
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | 
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSPARENT);

为了不在锁屏上显示,我使用

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT, 
WindowManager.LayoutParams.WRAP_CONTENT, 
WindowManager.LayoutParams.TYPE_PHONE, 
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | 
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSPARENT);

单独它们工作正常,但我想以编程方式更改类型和标志。所以我尝试将 WindowManager.LayoutParams 更改为

params.flags &= ~WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
params.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
params.flags |= WindowManager.LayoutParams.TYPE_PHONE;
windowManager.updateViewLayout(myView,params);

删除类型,删除标志并设置新类型, 但这似乎不起作用。有谁知道如何正确地做到这一点?

您正在将 type 值设置为 flag。试试这个:

params.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;

// type is no bit flag, so this should do it
params.type = WindowManager.LayoutParams.TYPE_PHONE;