在状态栏上方显示视图?

Posted

技术标签:

【中文标题】在状态栏上方显示视图?【英文标题】:Display view above status bar? 【发布时间】:2012-04-06 15:18:23 【问题描述】:

我最近看到了一个应用程序的图像,它能够在状态栏上方显示一个视图,并且还能够用一个视图覆盖它。

我知道您可以从带有 align parent top 的视图中获得状态栏正下方的视图。但是如何在状态栏顶部获得视图??

Example

【问题讨论】:

任何指向图像的链接以弄清楚您在说什么? 你在说play.google.com/store/apps/… 没错。单击示例以查看图像示例。无论如何,我不知道你甚至可以做到这一点。我认为状态栏是最重要的,如果你愿意,它只能隐藏 【参考方案1】:

禁用系统状态栏 - 没有 Root


经过整整两天搜索 SO 帖子并一遍又一遍地阅读 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。

【讨论】:

WindowManager 应该像这样 getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 也需要这个权限 【参考方案2】:

@Sadeshkumar 的回答对于 ICS 及更高版本(也许 GB 也是)不正确。

使用TYPE_SYSTEM_ALERTFLAG_LAYOUT_IN_SCREEN 创建的视图被StatusBar 覆盖。

要在StatusBar 上叠加,您需要使用TYPE_SYSTEM_OVERLAY 而不是TYPE_SYSTEM_ALERT

那么问题来了,如何获得点击/触摸?

【讨论】:

有没有办法使用系统覆盖来获取触摸事件?【参考方案3】:

使用TYPE_SYSTEM_ERRORFLAG_LAYOUT_IN_SCREEN 创建的视图被StatusBar 覆盖。

【讨论】:

和 TYPE_SYSTEM_ERROR + FLAG_LAYOUT_IN_SCREEN 将是可触摸的。【参考方案4】:
 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);  

【讨论】:

以上是关于在状态栏上方显示视图?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 或 UIWindow 放在状态栏上方

如何添加覆盖所有其他视图(包括导航栏和状态栏)的暗屏?

状态栏上方的导航栏

状态栏在工具栏上方是白色的[重复]

仅在模态显示的视图控制器上隐藏状态栏

显示模态视图时使 iPhone 状态栏消失?