在状态栏上方显示视图?

10

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

我知道你可以通过将对齐方式设置为父容器顶部,从一个视图中获取紧贴状态栏下方的视图。但是如何在状态栏上方获得视图?

示例


有没有任何链接可以查看你所说的内容是什么? - Asdfg
你是在说这个网址吗?https://play.google.com/store/apps/details?id=com.tombarrasso.android.wp7barfree - Diego Torres Milano
没错。点击示例以查看图像示例。无论如何,我不知道你甚至可以这样做。我认为状态栏是在所有内容之上,并且只有在您需要隐藏它时才能隐藏。 - user1190019
4个回答

29

无需Root禁用系统状态栏


在翻阅了两天的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 版本。


WindowManager 应该像这样获取:getApplicationContext().getSystemService(Context.WINDOW_SERVICE); - user2486322
需要这个权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> - user2486322

12

@Sadeshkumar的回答对ICS及以上版本(也许GB版本)不正确。

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

要在StatusBar上方获取叠加层,需要使用TYPE_SYSTEM_OVERLAY而不是TYPE_SYSTEM_ALERT

问题是如何获取点击/触摸?


1
有没有一种方法可以使用系统覆盖获取触摸事件? - amalBit

6

使用TYPE_SYSTEM_ERRORFLAG_LAYOUT_IN_SCREEN创建的视图会被StatusBar遮挡。


1
并且 TYPE_SYSTEM_ERROR + FLAG_LAYOUT_IN_SCREEN 将是可触摸的。 - om252345

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);  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接