我需要知道动作栏的像素大小,以便应用正确的背景图像。


当前回答

课程摘要通常是一个很好的开始。我认为getHeight()方法就足够了。

编辑:

如果你需要宽度,它应该是屏幕的宽度(对吧?),可以像这样收集。

其他回答

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

它基本上可以归结为使用限定词。高度由维度"action_bar_default_height"定义

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

课程摘要通常是一个很好的开始。我认为getHeight()方法就足够了。

编辑:

如果你需要宽度,它应该是屏幕的宽度(对吧?),可以像这样收集。

要在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();

如果你需要了解它的定义:

属性名本身定义在平台的/res/values/attrs.xml文件中 平台的themes.xml选择此属性并为其赋值。 在第2步中分配的值取决于不同的设备大小,这些设备大小在平台中的各种dimensions .xml文件中定义,例如。核心/ res / res / values-sw600dp / dimens.xml

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

在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来看)…