应用禁用通知栏下拉这个需求让我头疼了好几天 statusbar用了后但是效果不是很满意 其他的方法试过但是没有效果,所以就换个思路吧 做法是在通知栏区域弄一个透明的window,这样下拉的时候触摸的区域就是这个window,系统的就下拉不了了 该做法是需要在应用上方显示一个window 所以需要权限
代码语言:javascript复制 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
代码语言:javascript复制 public static final String STATUS_BAR_HEIGHT = "status_bar_height";
public static final String DIMEN = "dimen";
public static final String DEF_PACKAGE = "android";
public static void preventStatusBarExpansion(Context context) {
WindowManager manager = ((WindowManager) context.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
int resId = context.getResources()
.getIdentifier(STATUS_BAR_HEIGHT, DIMEN, DEF_PACKAGE);
int result;
if (resId > 0) {
result = context.getResources()
.getDimensionPixelSize(resId);
} else {
// Use Fallback size:
result = 60; // 60px Fallback
}
localLayoutParams.height = result;
localLayoutParams.format = PixelFormat.TRANSPARENT;
if (view == null) {
view = new CustomViewGroup(context);
}
try {
if (manager != null) {
manager.addView(view, localLayoutParams);
}
} catch (Exception ignored) {
}
}
public static void allowStatusBarExpansion(Context context) {
WindowManager manager = ((WindowManager) context.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
try {
if (manager != null) {
manager.removeViewImmediate(view);
}
} catch (Exception ignored) {
}
}
public static class CustomViewGroup extends ViewGroup {
public CustomViewGroup(Context context) {
super(context);
}
@Override
protected void onLayout(boolean changed,
int l,
int t,
int r,
int b) {
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Intercepted touch!
return true;
}
}