如何禁用状态栏单击并在Android中下拉?我尝试了很多东西,但这不起作用。如何禁用状态栏单击并在Android中下拉?
1
A
回答
3
在我看来,有2个选项:
选择1:你可以把在状态栏窗口禁用任何触摸或拉低。选项2:您也可以重写OnWindowFocusChanged()方法,以在显示后立即关闭通知面板。
如何:
选项1:定义您的活动如下方法(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" />
其次,在您的活动定义以下类范围的变量:
// To keep track of activity's window focus
boolean currentFocus;
// To keep track of activity's foreground/background status
boolean isPaused;
Handler collapseNotificationHandler;
三,覆盖onWindowFocusChanged(布尔值):
@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;
}
完成!
注意:在将应用程序置于Kiosk模式下时,我没有显示通知面板,所以我使用了第一个选项。 另一方面,第二个选项运行良好,但它允许通知面板在短时间内显示,用户可以快速单击通知面板顶部的设置图标以退出信息亭模式。
希望这会帮助你。 干杯!
相关问题
- 1. 如何在Android中禁用状态栏?
- 2. 如何在android中禁用状态栏?
- 3. 禁用android中状态栏的单击事件
- 4. 在Android中禁用/隐藏状态栏
- 5. 微调单击下拉菜单显示状态栏
- 6. 禁用状态,如果单击ButtonBar中的向下按钮
- 7. 在活动中禁用状态栏
- 8. 如何在第三方应用上折叠状态栏的下拉菜单?
- 9. 当用户在android中点击状态栏时如何从状态栏中删除通知?
- 10. 状态栏隐藏在全屏下,但在Android中按下菜单键时显示状态栏
- 11. 单击时禁用值下拉列表
- 12. 如何以编程方式禁用Android状态栏?
- 13. 如何禁用状态栏或通知栏,但不禁用android中的标题栏?
- 14. Android在状态栏下绘制
- 15. 在Android平板电脑/手机中阻止/禁用状态栏
- 16. 如何在状态栏中创建上下文菜单?
- 17. 如何禁用单击Android中的ListView?
- 18. 如何确定Android中是否存在单独的状态栏?
- 19. 下拉菜单保持选中状态
- 20. 如何禁用下拉菜单?
- 21. 如何下拉状态栏编程机器人
- 22. 如何在下拉菜单栏中调用传单JavaScript函数?
- 23. 禁用状态栏时,应用程序不会收到点击
- 24. 操作栏下拉单击事件
- 25. 在下拉菜单中禁用输入
- 26. Android:如何创建一个接收器,听取任何点击状态栏下拉?
- 27. 隐藏Android状态栏中
- 28. Android状态栏中的MusicPlayer
- 29. Android状态栏中停留
- 30. 单击按钮时显示和隐藏状态栏:Android
你试过了什么?张贴你的努力可能会让你更好的回答 – Muds
[防止状态栏扩展]可能的重复(http://stackoverflow.com/questions/7457730/preventing-status-bar-expansion) – appoll
我只是想让用户停止拉状态栏。这怎么可能? –