我最近看到一张图片,显示一个应用程序能够在状态栏上方显示视图,并且还能够用一个视图覆盖状态栏。
我知道你可以通过将对齐方式设置为父容器顶部,从一个视图中获取紧贴状态栏下方的视图。但是如何在状态栏上方获得视图?
我最近看到一张图片,显示一个应用程序能够在状态栏上方显示视图,并且还能够用一个视图覆盖状态栏。
我知道你可以通过将对齐方式设置为父容器顶部,从一个视图中获取紧贴状态栏下方的视图。但是如何在状态栏上方获得视图?
在翻阅了两天的Stack Overflow文章和一遍又一遍地阅读Android文档后,我想出了以下解决方案(已测试)。
mView= new TextView(this);
mView.setText(".........................................................................");
mLP = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
100,
// Allows the view to be on top of the StatusBar
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
// Keeps the button presses from going to the background window
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
// Enables the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
mLP.gravity = Gravity.TOP|Gravity.CENTER;
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mView, mLP);
不要忘记权限:<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
注意:
已测试至 KitKat 版本。
@Sadeshkumar的回答对ICS及以上版本(也许GB版本)不正确。
使用TYPE_SYSTEM_ALERT
和FLAG_LAYOUT_IN_SCREEN
创建的视图将被StatusBar
覆盖。
要在StatusBar
上方获取叠加层,需要使用TYPE_SYSTEM_OVERLAY
而不是TYPE_SYSTEM_ALERT
。
问题是如何获取点击/触摸?
使用TYPE_SYSTEM_ERROR
和FLAG_LAYOUT_IN_SCREEN
创建的视图会被StatusBar
遮挡。
int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
View statusBarView = new View(MyActivity.this);
statusBarView.setBackgroundColor(Color.GREEN);
WindowManager.LayoutParams params = null;
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,statusBarHeight,WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(statusBarView, params);