【问题标题】:What is the size of ActionBar in pixels?ActionBar 的大小(以像素为单位)是多少?
【发布时间】:2011-11-02 05:02:21
【问题描述】:

我需要知道 ActionBar 的确切大小(以像素为单位),以便应用正确的背景图像。

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

    要在 XML 中检索 ActionBar 的高度,只需使用

    ?android:attr/actionBarSize
    

    或者,如果您是 ActionBarSherlock 或 AppCompat 用户,请使用此

    ?attr/actionBarSize
    

    如果你在运行时需要这个值,使用这个

    final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                        new int[] { android.R.attr.actionBarSize });
    mActionBarSize = (int) styledAttributes.getDimension(0, 0);
    styledAttributes.recycle();
    

    如果您需要了解这是在哪里定义的:

    1. 属性名本身在平台的/res/values/attrs.xml中定义
    2. 平台的themes.xml 选择此属性并为其分配一个值。
    3. 步骤2中分配的值取决于不同的设备大小,在平台的various dimens.xml files中定义,即。 core/res/res/values-sw600dp/dimens.xml

    【讨论】:

    • 很好的答案。我知道挖掘这些信息的方法,但是搜索这个答案要快得多+1。您的回答也是如何搜索此类内容的一个很好的提示。
    • 谢谢。我试图直接使用@dimen/abc_action_bar_default_height(ActionBarComapt)并且它工作(在 mdpi 设备上)。但是试图在三星 Galaxy SIII 上获得这个值却给我带来了错误的值。这是因为在横向模式下,values-xlarge(不知何故)比values-land 更受欢迎。引用属性就像一个魅力。
    • @AZ13 我想补充一点,android.R.attr.actionBarSize 将在 3.0 之前的设备上解析为 0 大小。因此,当使用ActionBarCompat 时,人们会坚持使用android.support.v7.appcompat.R.attr.actionBarSize
    • 这家伙以像素为单位问的。我想 actionBarSize 返回 dp 值。我得到了 48dp 的值。这意味着将其转换为像素可以为 xhdpi 提供 96 个像素。
    • "android.R.attr.actionBarSize" 在 android 版本 2.3 中不起作用,但 "R.attr.actionBarSize" 在 android 所有版本中都有效。只需使用“R.attr.actionBarSize”而不是“android.R.attr.actionBarSize”等。
    【解决方案2】:

    来自 Android 3.2 的 framework-res.apk 的反编译源,res/values/styles.xml 包含:

    <style name="Theme.Holo">
        <!-- ... -->
        <item name="actionBarSize">56.0dip</item>
        <!-- ... -->
    </style>
    

    3.0 和 3.1 似乎是一样的(至少来自 AOSP)...

    【讨论】:

    • 横屏操作栏的高度不一样怎么办?
    • 在 4.0+ 上:默认为 48dp,横向为 40dp,sw600dp 为 56dp
    • 这就是为什么你应该使用 android:attr 值而不是硬编码值!
    【解决方案3】:

    要获取 Actionbar 的实际高度,您必须在运行时解析属性 actionBarSize

    TypedValue tv = new TypedValue();
    context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
    int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
    

    【讨论】:

      【解决方案4】:

      其中一个 Honeycomb 样本引用了?android:attr/actionBarSize

      【讨论】:

      • 如果你的 min sdk >=11,这就是答案,如果你的 min 是
      • ABS 有 ?attr/actionBarSize(注意缺少 android 命名空间),适用于所有 API 级别。
      【解决方案5】:

      我需要在 ICS 之前的兼容性应用程序中正确复制这些高度,并深入了解 framework core source。上面两个答案都是正确的。

      它基本上归结为使用限定符。高度由维度“action_bar_default_height”定义

      默认定义为 48dip。但 -land 为 40dip,sw600dp 为 56dip。

      【讨论】:

        【解决方案6】:

        如果您使用的是最新 v7 appcompat 支持包中的兼容性 ActionBar,您可以使用以下方法获取高度

        @dimen/abc_action_bar_default_height
        

        Documentation

        【讨论】:

          【解决方案7】:

          使用新的 v7 support library (21.0.0),R.dimen 中的名称已更改为 @dimen/abc_action_bar_default_height_material

          从以前版本的支持库升级时,您应该使用该值作为操作栏的高度

          【讨论】:

          • 完美!如果您希望匹配常规的ActionBar,这肯定会胜过?attr/actionBarSize
          【解决方案8】:

          如果你使用的是 ActionBarSherlock,你可以用

          @dimen/abs__action_bar_default_height
          

          【讨论】:

          • 不要直接使用abs__-前缀资源。
          • @JakeWharton 请告诉我们如何正确地做到这一点。
          • 创建你自己的维度,这样你就不会依赖于 abs_。
          【解决方案9】:

          @AZ13 的回答很好,但是按照Android design guidelines,ActionBar 应该是at least 48dp high

          【讨论】:

            【解决方案10】:
            public int getActionBarHeight() {
                int actionBarHeight = 0;
                TypedValue tv = new TypedValue();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                            true))
                        actionBarHeight = TypedValue.complexToDimensionPixelSize(
                                tv.data, getResources().getDisplayMetrics());
                } else {
                    actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                            getResources().getDisplayMetrics());
                }
                return actionBarHeight;
            }
            

            【讨论】:

              【解决方案11】:

              Class Summary 通常是一个不错的起点。我认为 getHeight() 方法就足够了。

              编辑:

              如果您需要宽度,它应该是屏幕的宽度(对吗?),可以收集like this

              【讨论】:

              • 奇怪 - getHeight() 结果为零。
              • 在我的开发中,我注意到它在 onResume() 中返回零。当你真正需要它时,悬停调用 getActionBar().getHeight() 返回一个正的 >0 值。
              • @tos 的 getHeight() 规范说它返回 ActionBar 的当前宽度,创建视图时可能为 0
              【解决方案12】:

              在我的 Galaxy S4 上,分辨率 > 441dpi > 1080 x 1920 > 使用 getResources().getDimensionPixelSize 获取 Actionbar 高度我得到了 144 像素。

              使用公式 px = dp x (dpi/160),我使用的是 441dpi,而我的设备位于
              在 480dpi 类别中。所以把这证实了结果。

              【讨论】:

                【解决方案13】:

                我自己就是这样做的,这个辅助方法应该对某人有用:

                private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};
                
                /**
                 * Calculates the Action Bar height in pixels.
                 */
                public static int calculateActionBarSize(Context context) {
                    if (context == null) {
                        return 0;
                    }
                
                    Resources.Theme curTheme = context.getTheme();
                    if (curTheme == null) {
                        return 0;
                    }
                
                    TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
                    if (att == null) {
                        return 0;
                    }
                
                    float size = att.getDimension(0, 0);
                    att.recycle();
                    return (int) size;
                }
                

                【讨论】:

                  【解决方案14】:

                  在 Kotlin 中接受的答案:

                  val Context.actionBarSize
                      get() = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
                          .let { attrs -> attrs.getDimension(0, 0F).toInt().also { attrs.recycle() } }
                  

                  用法:

                  val size = actionBarSize                    // Inside Activity
                  val size = requireContext().actionBarSize   // Inside Fragment
                  val size = anyView.context.actionBarSize    // Inside RecyclerView ViewHolder
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-04-03
                    • 1970-01-01
                    • 2011-05-27
                    • 2010-11-06
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多