如何禁用 Android 状态栏交互
How to disable Android status bar interaction
在 android 上有没有一种方法可以保留状态栏,同时禁用您可以使用它进行的所有交互,例如将其下拉?
我想保留此栏提供的信息,但我不希望用户与其交互。
这是我喜欢用的方法。您可以将其从方法中解包并将其放在基 Activity 中。 iirc,我也是从 Whosebug 得到的,但是我没有记下来所以我不确定原来的 post 在哪里。
它基本上做的是在拦截所有触摸事件的顶部栏上放置一个透明覆盖层。到目前为止它对我来说效果很好,看看它对你的效果如何。
您可能需要将此行放入 AndroidManifest:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
我的项目中有,但我不记得是因为这个还是其他原因。如果您遇到权限错误,请将其添加到。
WindowManager manager;
CustomViewGroup lockView;
public void lock(Activity activity) {
//lock top notification bar
manager = ((WindowManager) activity.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams topBlockParams = new WindowManager.LayoutParams();
topBlockParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
topBlockParams.gravity = Gravity.TOP;
topBlockParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
topBlockParams.width = WindowManager.LayoutParams.MATCH_PARENT;
topBlockParams.height = (int) (50 * activity.getResources()
.getDisplayMetrics().scaledDensity);
topBlockParams.format = PixelFormat.TRANSPARENT;
lockView = new CustomViewGroup(activity);
manager.addView(lockView, topBlockParams);
}
而 CustomViewGroup 是
private class CustomViewGroup extends ViewGroup {
Context context;
public CustomViewGroup(Context context) {
super(context);
this.context = context;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i("StatusBarBlocker", "intercepted by "+ this.toString());
return true;
}
}
还有!您还必须在 activity 结束时删除此视图,因为我认为即使在您终止应用程序后它仍会继续阻塞屏幕。总是,总是总是调用这个 onPause 和 onDestroy。
if (lockView!=null) {
if (lockView.isShown()) {
//unlock top
manager.removeView(lockView);
}
}
在 android 上有没有一种方法可以保留状态栏,同时禁用您可以使用它进行的所有交互,例如将其下拉?
我想保留此栏提供的信息,但我不希望用户与其交互。
这是我喜欢用的方法。您可以将其从方法中解包并将其放在基 Activity 中。 iirc,我也是从 Whosebug 得到的,但是我没有记下来所以我不确定原来的 post 在哪里。
它基本上做的是在拦截所有触摸事件的顶部栏上放置一个透明覆盖层。到目前为止它对我来说效果很好,看看它对你的效果如何。
您可能需要将此行放入 AndroidManifest:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
我的项目中有,但我不记得是因为这个还是其他原因。如果您遇到权限错误,请将其添加到。
WindowManager manager;
CustomViewGroup lockView;
public void lock(Activity activity) {
//lock top notification bar
manager = ((WindowManager) activity.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams topBlockParams = new WindowManager.LayoutParams();
topBlockParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
topBlockParams.gravity = Gravity.TOP;
topBlockParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
topBlockParams.width = WindowManager.LayoutParams.MATCH_PARENT;
topBlockParams.height = (int) (50 * activity.getResources()
.getDisplayMetrics().scaledDensity);
topBlockParams.format = PixelFormat.TRANSPARENT;
lockView = new CustomViewGroup(activity);
manager.addView(lockView, topBlockParams);
}
而 CustomViewGroup 是
private class CustomViewGroup extends ViewGroup {
Context context;
public CustomViewGroup(Context context) {
super(context);
this.context = context;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i("StatusBarBlocker", "intercepted by "+ this.toString());
return true;
}
}
还有!您还必须在 activity 结束时删除此视图,因为我认为即使在您终止应用程序后它仍会继续阻塞屏幕。总是,总是总是调用这个 onPause 和 onDestroy。
if (lockView!=null) {
if (lockView.isShown()) {
//unlock top
manager.removeView(lockView);
}
}