Android:为API 19禁用并启用以编程方式拉动状态栏
我已经做了隐藏状态栏的操作,但不幸的是,我没有找到在状态栏已经隐藏后显示它的方法。我做了这么多的变通,但仍然没有成功 活动Android:为API 19禁用并启用以编程方式拉动状态栏,android,statusbar,Android,Statusbar,我已经做了隐藏状态栏的操作,但不幸的是,我没有找到在状态栏已经隐藏后显示它的方法。我做了这么多的变通,但仍然没有成功 活动 WindowManager manager = ((WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE)); WindowManager.LayoutParams localLayoutParams = new WindowMan
WindowManager manager = ((WindowManager) 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|
// this is to enable the notification to receive touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 * getResources()
.getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
customViewGroup view = new customViewGroup(this);
manager.addView(view, localLayoutParams);
customViewGroup类
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) {
return true;
}
}
用于在4.1或更高版本上隐藏状态栏
或
使状态栏可见的步骤
或
用于在4.1或更高版本上隐藏状态栏
或
使状态栏可见的步骤
或
我认为永久禁用状态栏很困难。我也在研究同样的概念,做了大量的研发,发现下面的代码很有用。如果用户试图展开状态栏,那么在一秒钟内,它会将状态栏拉回,并在oreo上工作。我试过不同的操作系统
public class BlockStatusBar {
Context context
// To keep track of activity's window focus
boolean currentFocus;
// To keep track of activity's foreground/background status
boolean isPaused;
public Handler collapseNotificationHandler;
Method collapseStatusBar = null;
public BlockStatusBar(Context context, boolean isPaused) {
this.context = context;
this.isPaused = isPaused;
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) {
Runnable myRunnable = new Runnable() {
public void run() {
// do something
try {
// Use reflection to trigger a method from 'StatusBarManager'
Object statusBarService = context.getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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'kioskthread 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);
}
if (!currentFocus && isPaused) {
collapseNotificationHandler.removeCallbacksAndMessages(null);
}
} catch (Exception e) {
Log.e("MSG", "" + e.getMessage());
}
}
};
// Post a Runnable with some delay - currently set to 300 ms
collapseNotificationHandler.postDelayed(myRunnable, 1L);
}
}
}
公共类BlockStatusBar{
语境
//跟踪活动的窗口焦点
布尔当前焦点;
//跟踪活动的前景/背景状态
布尔值是有原因的;
公共处理程序collapseNotificationHandler;
方法collapseStatusBar=null;
公共块状态栏(上下文上下文,布尔值isPaused){
this.context=上下文;
this.isPaused=isPaused;
collapseNow();
}
公共空间坍塌{
//初始化“collapseNotificationHandler”
if(collapseNotificationHandler==null){
collapseNotificationHandler=新处理程序();
}
//如果窗口焦点已丢失&&activity未处于暂停状态
//这是一个有效的检查,因为显示了通知面板
//从当前活动的窗口窃取焦点,但不会
//“暂停”活动
如果(!currentFocus&&!isPaused){
Runnable myRunnable=新Runnable(){
公开募捐{
//做点什么
试一试{
//使用反射从“StatusBarManager”触发方法
对象statusBarService=context.getSystemService(“statusbar”);
类statusBarManager=null;
试一试{
statusBarManager=Class.forName(“android.app.statusBarManager”);
}catch(classnotfounde异常){
Log.e(Log_标记,“+e.getMessage());
}
试一试{
//在API 17之前,要调用的方法是“collapse()
//从API 17开始,要调用的方法是`collapsePanels()`
如果(Build.VERSION.SDK_INT>16){
collapseStatusBar=statusBarManager.getMethod(“collapsePanels”);
}否则{
collapseStatusBar=statusBarManager.getMethod(“折叠”);
}
}捕获(无此方法例外){
Log.e(Log_标记,“+e.getMessage());
}
collapseStatusBar.setAccessible(true);
试一试{
调用(statusBarService);
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(调用TargetException e){
e、 printStackTrace();
}
//检查窗口焦点是否已返回
//如果尚未返回kioskthread,请再次发布此Runnable
//目前,延迟为100毫秒。您可以更改此设置
//满足您的需求的价值。
如果(!currentFocus&&!isPaused){
collapseNotificationHandler.postDelayed(此,100L);
}
如果(!currentFocus&&isPaused){
collapseNotificationHandler.removeCallbacksAndMessages(空);
}
}捕获(例外e){
Log.e(“MSG”和“+e.getMessage());
}
}
};
//发布具有一定延迟的Runnable-当前设置为300毫秒
collapseNotificationHandler.postDelayed(myRunnable,1L);
}
}
}
我认为永久禁用状态栏很困难。我也在研究同样的概念,做了大量的研发,发现下面的代码很有用。如果用户试图展开状态栏,那么在一秒钟内,它会将状态栏拉回,并在oreo上工作。我试过不同的操作系统
public class BlockStatusBar {
Context context
// To keep track of activity's window focus
boolean currentFocus;
// To keep track of activity's foreground/background status
boolean isPaused;
public Handler collapseNotificationHandler;
Method collapseStatusBar = null;
public BlockStatusBar(Context context, boolean isPaused) {
this.context = context;
this.isPaused = isPaused;
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) {
Runnable myRunnable = new Runnable() {
public void run() {
// do something
try {
// Use reflection to trigger a method from 'StatusBarManager'
Object statusBarService = context.getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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'kioskthread 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);
}
if (!currentFocus && isPaused) {
collapseNotificationHandler.removeCallbacksAndMessages(null);
}
} catch (Exception e) {
Log.e("MSG", "" + e.getMessage());
}
}
};
// Post a Runnable with some delay - currently set to 300 ms
collapseNotificationHandler.postDelayed(myRunnable, 1L);
}
}
}
公共类BlockStatusBar{
语境
//跟踪活动的窗口焦点
布尔当前焦点;
//跟踪活动的前景/背景状态
布尔值是有原因的;
公共处理程序collapseNotificationHandler;
方法collapseStatusBar=null;
公共块状态栏(上下文上下文,布尔值isPaused){
this.context=上下文;
this.isPaused=isPaused;
collapseNow();
}
公共空间坍塌{
//初始化“collapseNotificationHandler”
if(collapseNotificationHandler==null){
collapseNotificationHandler=新处理程序();
}
//如果窗口焦点已丢失&&activity未处于暂停状态
//这是一个有效的检查,因为显示了通知面板
//从当前活动的窗口窃取焦点,但不会
//“暂停”活动
如果(!currentFocus&&!isPaused){
Runnable myRunnable=新Runnable(){
公开募捐{
//做点什么
试一试{
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.show();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
public class BlockStatusBar {
Context context
// To keep track of activity's window focus
boolean currentFocus;
// To keep track of activity's foreground/background status
boolean isPaused;
public Handler collapseNotificationHandler;
Method collapseStatusBar = null;
public BlockStatusBar(Context context, boolean isPaused) {
this.context = context;
this.isPaused = isPaused;
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) {
Runnable myRunnable = new Runnable() {
public void run() {
// do something
try {
// Use reflection to trigger a method from 'StatusBarManager'
Object statusBarService = context.getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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) {
Log.e(LOG_TAG, "" + e.getMessage());
}
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'kioskthread 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);
}
if (!currentFocus && isPaused) {
collapseNotificationHandler.removeCallbacksAndMessages(null);
}
} catch (Exception e) {
Log.e("MSG", "" + e.getMessage());
}
}
};
// Post a Runnable with some delay - currently set to 300 ms
collapseNotificationHandler.postDelayed(myRunnable, 1L);
}
}
}