我需要知道动作栏的像素大小,以便应用正确的背景图像。
课堂总结通常是一个很好的开始。我认为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();
如果你需要了解它的定义:
从Android 3.2的framework-res.apk的反编译源代码中,res/values/styles.xml包含:
framework-res.apk
res/values/styles.xml
<style name="Theme.Holo"> <!-- ... --> <item name="actionBarSize">56.0dip</item> <!-- ... --> </style>
3.0和3.1似乎是一样的(至少从AOSP来看)…
蜂巢样本之一引用?android:attr/actionBarSize
我需要在一个pre-ICS兼容应用程序中正确复制这些高度,并深入研究框架核心源。以上两个答案都是正确的。
它基本上可以归结为使用限定词。高度由维度"action_bar_default_height"定义
默认定义为48dip。但是对于-land是40dip,对于sw600dp是56dip。
@AZ13的答案很好,但根据Android设计指南,动作栏应该是至少48dp高。
为了获得动作栏的实际高度,你必须在运行时解析属性actionBarSize。
actionBarSize
TypedValue tv = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true); int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
如果你在使用ActionBarSherlock,你可以用
@dimen/abs__action_bar_default_height
如果你正在使用最近的v7 appcompat支持包中的兼容ActionBar,你可以使用
@dimen/abc_action_bar_default_height
文档 .
在我的Galaxy S4 > 441dpi > 1080 x 1920 > 使用getResources()获取动作栏高度。我得到144像素
在新的V7支持库(21.0.0)中,R.dimen中的名称已更改为@dimen / abc_action_bar_default_height_ < >强材料< / >强。
R.dimen
当从以前版本的支持库升级时,您应该使用该值作为动作栏的高度
我这样做是为了自己,这个帮手方法应该对其他人有用:
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; }
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; }
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