【问题标题】:Size of android notification bar and title bar?android通知栏和标题栏的大小?
【发布时间】:2010-08-30 13:21:16
【问题描述】:

有没有办法在android中获取通知栏和标题栏的大小?目前我通过以下方式获得显示宽度和高度:

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

之后我想减去条的大小,这样我就可以在不损失纵横比的情况下拉伸视频。目前我隐藏了这些栏,因为我看不到更好的方法。

【问题讨论】:

    标签: android


    【解决方案1】:

    我使用以下代码来获取高度:

    对于状态(通知)栏:

    View decorView = getWindow().getDecorView();
    Rect rect = new Rect();
    decorView.getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    

    对于标题栏:

    View contentView = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
    int[] location = new int[2];
    contentView.getLocationInWindow(location);
    int titleBarHeight = location[1] - statusBarHeight;
    

    【讨论】:

      【解决方案2】:

      *据我所知,这非常有效。

      public int getStatusBarHeight() {
                  int result = 0;
                  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
                  if (resourceId > 0) {
                      result = getResources().getDimensionPixelSize(resourceId);
                  }
                  return result;
              }*
      

      【讨论】:

      • 有效,这是了解所有屏幕尺寸的确切尺寸的最佳选择。谢谢
      【解决方案3】:

      Martin 的回答指定了错误的高度(至少从 SDKv11 开始)。根据Icon Design Guidelines,状态栏图标的高度为 25dp,而不是 32dp。 25dp 转化为这些特定于密度的高度:

      • LDPI 为 19 像素
      • MDPI 为 25 像素
      • HDPI 为 38 像素
      • XHDPI 为 50 像素

      观察这些大小的一种简单方法是对具有正常密度的模拟器或设备使用层次结构查看器。只需查看标题栏的 FrameLayout 的 getHeight() 的值。状态栏有点棘手,因为它是 DecorView 的一部分,而不是其本身的视图,因此通过查看位于状态栏正下方的标题栏 FrameLayout 的 mTop 间接获取其高度。根据我的观察,状态栏和标题栏每个都与状态栏图标的 25dp 高度匹配(我还没有在 SDKv11 的 android ref 中看到这一事实的声明)。

      【讨论】:

        【解决方案4】:

        也许这是一个有用的方法:参考Icon Design Guidelines,根据屏幕密度,状态(通知)栏只有三种不同的高度:

        • LDPI 为 24 像素
        • MDPI 为 32 像素
        • HDPI 为 48 像素

        因此,如果您使用densityDpiDisplayMetrics 检索设备的屏幕密度,您就知道要减去哪个值

        所以它可能看起来像这样:

            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int myHeight = 0;
        
            switch (metrics.densityDpi) {
                case DisplayMetrics.DENSITY_HIGH:
                    Log.i("display", "high");
                    myHeight = display.getHeight() - 48;
                    break;
                case DisplayMetrics.DENSITY_MEDIUM:
                    Log.i("display", "medium/default");
                    myHeight = display.getHeight() - 32;
                    break;
                case DisplayMetrics.DENSITY_LOW:
                    Log.i("display", "low");
                    myHeight = display.getHeight() - 24;
                    break;
                default:
                    Log.i("display", "Unknown density");
        

        【讨论】:

        • 这看起来很有希望。我试图实现它,但即使在 javadoc 中将 densityDpi 声明为 public,我也无法在 Eclipse 中访问它...使用密度似乎不是一种替代方法,正如 javadoc 所说:“这个值并不完全按照实际屏幕尺寸“
        • 谢谢!我没有意识到metrics.densityDpi 在Android 1.5 中不可用。现在我将我的项目更改为使用 1.6 并且它可以工作!我又改变了一件事:我将值乘以 2,例如display.getHeight() - 48 * 2. 我减去标题栏和通知栏的高度。希望这也适用于其他设备。刚刚在 Nexus 上测试过。
        • 我认为应该如此,因为规范是这么说的 - 如果您可以通过单击左侧的勾号图标来接受答案,那就太好了 :)
        • 通知栏高度(dp 24dp)
        【解决方案5】:

        您好,我认为这不是必需的,如果您使用 VideoView,这将是自动的

        VideoView vv = (VideoView) findViewById(R.id.MainVideo);                        
            MediaController mc=new MediaController(this);
            mc.setEnabled(true);
            mc.show(0);
            vv.setMediaController(mc); 
            vv.setVideoURI(Uri.parse(URLMedia));
            vv.requestFocus();
            vv.showContextMenu();
            vv.start();         
        

        【讨论】:

        • 我使用 SurfaceView 而不是 VideoView,因为我为控制元素实现了不同的 UI(我需要音量控制和切换全屏按钮)。我不使用 MediaController。
        【解决方案6】:

        我找到了一个教程可能对你有帮助 你对我有帮助! How to increase the size of the title bar in an Android application? 你可以改变你的标题栏大小和你想要的方式你可以得到它幸运的小伙子! 玩得开心

        【讨论】:

          【解决方案7】:

          很抱歉,有虚假评论,但使用常量作为通知栏的高度是不正确的。 只需获取全局视图(PhoneWindow$DecorView),然后获取它的子视图(它将只有一个视图(FrameLayout))。此布局包含您的应用程序视图并测量整个屏幕(@see FrameLayout.mHeight)。它的第一个布局将是您的第一个视图,因此获取它的top 将为您提供正确的通知栏高度。在没有上下文的情况下使用 FrameLayout 不会给您带来任何好处,因为在这种情况下,您孩子的顶部将等于 0。

          懒惰的人:

          ViewGroup decoreView = (ViewGroup)*YourActivityViewHere*.getRootView();
          int barSize = ((ViewGroup)decoreView.getChildAt(0)).getChildAt(0).getTop();
          

          你也可以使用

          getWindow().getDecorView().getRootView()
          

          而不是 YourActivityViewHere

          【讨论】:

            【解决方案8】:

            这比硬编码值好得多,因为 android 仍会返回该特定设备上状态栏或操作栏的高度值,即使它们可能不可见。

            因此,我们的想法是获取添加所有视图的内容视图。

            public View getContentView(Activity a) {
                    int id = a.getResources().getIdentifier("content", "id", "android");
                    return a.findViewById(id);
                }
            

            然后,在你的活动中

            View cView = getContentView(this);
            cView.post(()->{ 
            int offsetY = cView.getTop(); 
            // do whatever here.
            });
            

            上述代码的好处是它还可以考虑操作栏。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-09-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-23
              相关资源
              最近更新 更多