gpt4 book ai didi

android - 如何在 Android 中禁用状态栏点击和下拉?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:30 32 4
gpt4 key购买 nike

如何在 Android 中禁用状态栏点击和下拉?我已经尝试了很多东西,但这不起作用。

最佳答案

在我看来,有两种选择:

选项 1:您可以在状态栏上放置一个窗口以禁用任何触摸或下拉。

选项 2:您还可以覆盖 OnWindowFocusChanged() 方法以在通知面板出现后立即关闭它。

如何:

选项 1:在您的 Activity 中定义以下方法 (preventStatusBarExpansion) 和类 (CustomViewGroup)。

public static void preventStatusBarExpansion(Context context) {
WindowManager manager = ((WindowManager) context.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));

Activity activity = (Activity)context;
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.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;

localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
int resId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int result = 0;
if (resId > 0) {
result = activity.getResources().getDimensionPixelSize(resId);
}

localLayoutParams.height = result;

localLayoutParams.format = PixelFormat.TRANSPARENT;

customViewGroup view = new customViewGroup(context);

manager.addView(view, localLayoutParams);
}

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) {
Log.v("customViewGroup", "**********Intercepted");
return true;
}
}

并在activity的onCreate方法中调用preventStatusBarExpansion方法。完成!

选项 2:首先,将以下权限添加到 Androidmanifest.xml 文件中:

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

其次,在您的 Activity 中定义以下类作用域变量:

// To keep track of activity's window focus
boolean currentFocus;

// To keep track of activity's foreground/background status
boolean isPaused;

Handler collapseNotificationHandler;

第三,覆盖onWindowFocusChanged(boolean):

@Override
public void onWindowFocusChanged(boolean hasFocus) {

currentFocus = hasFocus;

if (!hasFocus) {

// Method that handles loss of window focus
collapseNow();
}
}

第四,定义collapseNow();方法:

public void collapseNow() {

// Initialize 'collapseNotificationHandler'
if (collapseNotificationHandler == null) {
collapseNotificationHandler = new Handler();
}

// If window focus has been lost && activity is not in a paused state
// Its a valid check because showing of notification panel
// steals the focus from current activity's window, but does not
// 'pause' the activity
if (!currentFocus && !isPaused) {

// Post a Runnable with some delay - currently set to 300 ms
collapseNotificationHandler.postDelayed(new Runnable() {

@Override
public void run() {

// Use reflection to trigger a method from 'StatusBarManager'

Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;

try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

Method collapseStatusBar = null;

try {

// Prior to API 17, the method to call is 'collapse()'
// API 17 onwards, the method to call is `collapsePanels()`

if (Build.VERSION.SDK_INT > 16) {
collapseStatusBar = statusBarManager .getMethod("collapsePanels");
} else {
collapseStatusBar = statusBarManager .getMethod("collapse");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

collapseStatusBar.setAccessible(true);

try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

// Check if the window focus has been returned
// If it hasn't been returned, post this Runnable again
// Currently, the delay is 100 ms. You can change this
// value to suit your needs.
if (!currentFocus && !isPaused) {
collapseNotificationHandler.postDelayed(this, 100L);
}

}
}, 300L);
}
}

最后,覆盖 onPause() 和 onResume 方法:

@Override
protected void onPause() {
super.onPause();

// Activity's been paused
isPaused = true;
}

@Override
protected void onResume() {
super.onResume();

// Activity's been resumed
isPaused = false;
}

完成!

注意:我在将应用程序置于信息亭模式时使用了第一个选项,它根本不显示通知面板。另一方面,第二个选项效果很好,但它允许通知面板显示一小段时间,用户可以快速单击通知面板顶部的设置图标以退出信息亭模式。

希望对您有所帮助。干杯!

关于android - 如何在 Android 中禁用状态栏点击和下拉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29969086/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com