ActionBar的大小以像素为单位?


Answers:


558

要以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文件中定义,即。核心/res/res/values-sw600dp/dimens.xml

7
好答案。我知道挖掘这些信息的方法,但是搜索此答案的速度要快+1。您的答案也很好地提示了如何搜索此类内容。
休息

1
谢谢。我正尝试@dimen/abc_action_bar_default_height直接使用(ActionBarComapt),并且在mdpi设备上工作了。但是尝试在三星Galaxy SIII上获得此值返回了错误的值。这是因为values-xlarge(在某种程度上)比values-land在横向模式下更可取。引用属性反而像魅力一样工作。
Alex Semeniuk 2014年

4
@ AZ13我想补充一点,android.R.attr.actionBarSize它将在3.0之前的设备上解析为0大小。因此,在使用时ActionBarCompat会坚持使用android.support.v7.appcompat.R.attr.actionBarSize
提请2014年

1
那家伙以像素为单位问。我想actionBarSize返回dp值。我得到了48dp的值。这意味着将其转换为像素可得到xhdpi的96像素。
穆罕默德

“ android.R.attr.actionBarSize”在android 2.3版中不起作用,但是“ R.attr.actionBarSize”在android所有版本中均起作用。只需使用“ R.attr.actionBarSize”代替“ android.R.attr.actionBarSize”等。–
纳撒尼尔·乔布斯

59

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

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

3.0和3.1似乎是相同的(至少从AOSP起)...


1
风景中动作栏的不同高度如何?
Manfred Moser 2012年

86
在4.0+:默认值为48dp,横向为40dp,sw600dp为56dp
Jake Wharton

19
这就是为什么您应该使用android:attr值而不是硬编码值的原因!
Vikram Bodicherla

45

要获取操作栏的实际高度,您必须actionBarSize在运行时解析该属性。

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

33

蜂窝样品之一是指 ?android:attr/actionBarSize



3
这是答案,如果您的最小sdk> = 11,如果您的最小sdk是<11,那么很可能您正在使用ABS,那么这就是解决方案:@ dimen / abs__action_bar_default_height
亚当

9
ABS具有?attr/actionBarSize(注意缺少android命名空间),可在所有API级别上使用。
杰克·沃顿

21

我需要在ICS之前的兼容性应用中正确复制这些高度,并挖掘到框架核心源代码中。上面的两个答案都是正确的。

基本上可以归结为使用限定符。高度由尺寸“ action_bar_default_height”定义

默认将其定义为48dip。但是对于陆地而言,它是40dip,而对于sw600dp,它是56dip。


17

如果您使用的是最新的v7 appcompat支持包中的兼容性ActionBar,则可以使用

@dimen/abc_action_bar_default_height

文献资料



9

如果使用ActionBarSherlock,则可以使用

@dimen/abs__action_bar_default_height

不要abs__直接使用-prefixed资源。
杰克·沃顿

2
@JakeWharton请告诉我们如何正确执行操作。
JesperB 2014年

创建自己的尺寸,以便您不依赖于abs_。
2014年


1
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;
}

0

类摘要通常是一个良好的开端。我认为getHeight()方法就足够了。

编辑:

如果你需要的宽度,它应该是屏幕的宽度(右?),并且可以收集这样


2
奇怪-getHeight()结果为零。
尤金,

1
在我的开发中,我注意到它在onResume()中返回零。在您实际需要时调用getActionBar()。getHeight()的方法将返回一个大于0的正值。
tos 2012年

@tos getHeight()的规范说,它返回ActionBar的当前宽度,创建视图时该宽度可能为0
显示名称

0

在我的> 441dpi> 1080 x 1920>的Galaxy S4上,使用getResources()。getDimensionPixelSize获取操作栏高度时,我得到了144个像素。

使用公式px = dp x(dpi / 160),我使用的是441dpi,而我的设备属于480dpi
类别。因此,可以确认结果。


0

我以这种方式为自己做,这种辅助方法应该对某人有用:

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.