ActionBar在像素上的大小是多少?

284

我需要知道ActionBar的确切像素大小,以便应用正确的背景图片。

15个回答

609

要在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中分配的值取决于不同的设备大小,这些大小在平台的各种dimens.xml文件中定义,即core/res/res/values-sw600dp/dimens.xml等。

9
好的回答。我知道挖掘这些信息的方法,但搜索这个答案会更快+1。你的答案也是搜索这类问题的一个很好的提示。 - rekire
1
谢谢。我试图直接使用@dimen/abc_action_bar_default_height(ActionBarComapt),并且它在mdpi设备上运行良好。但是,在三星Galaxy SIII上尝试获取此值会返回错误的值。这是因为在横向模式下,“values-xlarge”(不知何故)比“values-land”更受欢迎。引用属性就像魔法一样奏效。 - Alex Semeniuk
4
我想补充一点,android.R.attr.actionBarSize在3.0以下的设备上会解析为0大小。因此,在使用ActionBarCompat时,应使用android.support.v7.appcompat.R.attr.actionBarSize - Drew
1
那个人用像素来询问。我想actionBarSize返回dp值。我得到了48dp的值。这意味着将其转换为像素,对于xhdpi屏幕,我得到了96像素。 - Muhammad
"android.R.attr.actionBarSize" 在 Android 2.3 版本中无法使用,但 "R.attr.actionBarSize" 可以在所有版本的 Android 中使用。只需使用 "R.attr.actionBarSize" 而不是 "android.R.attr.actionBarSize" 等即可。 - Nathaniel Jobs
显示剩余4条评论

64

从反编译的Android 3.2 framework-res.apk源代码中,res/values/styles.xml包含:

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

从AOSP来看,3.0和3.1似乎是相同的...


1
横屏模式下操作栏的高度会有所不同,您考虑过了吗? - Manfred Moser
91
在 Android 4.0 及以上版本中,默认值为 48dp,横屏模式下为 40dp,sw600dp 屏幕宽度以上的设备为 56dp。 - Jake Wharton
24
所以你应该使用android:attr的值而不是硬编码的值! - Vikram Bodicherla

48

要获取操作栏(Actionbar)的实际高度,您需要在运行时解析属性actionBarSize

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

35

其中一个蜂窝样本涉及到?android:attr/actionBarSize


3
好的,这是链接说明:http://developer.android.com/guide/topics/ui/actionbar.html#GeneralStyles 。 - Pointer Null
3
如果您的最低SDK版本号大于或等于11,则以下是答案。如果您的最低SDK版本号小于11,则很可能是在使用ABS,那么这就是解决方案:@dimen/abs__action_bar_default_height。请注意,本翻译不包含任何解释或额外内容。 - Adam
9
ABS有?attr/actionBarSize这个属性(注意没有android命名空间),在所有API级别上都可以使用。 - Jake Wharton

21

我需要在一个兼容pre-ICS版本的应用程序中正确复制这些高度,并深入挖掘框架核心源代码。以上两个答案都有点正确。

基本上,这归结于使用限定符。高度由维度 "action_bar_default_height" 定义。

它被定义为默认的48dip。但是对于-land,它是40dip,对于sw600dp,它是56dip。


17

如果您正在使用最新的v7 AppCompat支持包中的兼容ActionBar,则可以使用以下方式获取其高度:

@dimen/abc_action_bar_default_height

文档


16

1
太完美了!如果想匹配常规的“ActionBar”,这肯定比?attr/actionBarSize更好。 - karllindmark

9

如果您正在使用ActionBarSherlock,请使用以下代码获取高度:

@dimen/abs__action_bar_default_height

请不要直接使用以 abs__ 前缀开头的资源。 - Jake Wharton
3
@JakeWharton,请告诉我们如何正确地做,谢谢。 - JesperB
创建自己的维度,这样您就不会依赖于 abs_。 - Codeversed

5

3

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

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