Answers:
要以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();
如果您需要了解定义的位置:
@dimen/abc_action_bar_default_height
直接使用(ActionBarComapt),并且在mdpi设备上工作了。但是尝试在三星Galaxy SIII上获得此值返回了错误的值。这是因为values-xlarge
(在某种程度上)比values-land
在横向模式下更可取。引用属性反而像魅力一样工作。
android.R.attr.actionBarSize
它将在3.0之前的设备上解析为0大小。因此,在使用时ActionBarCompat
会坚持使用android.support.v7.appcompat.R.attr.actionBarSize
。
从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起)...
要获取操作栏的实际高度,您必须actionBarSize
在运行时解析该属性。
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
使用新的v7支持库(21.0.0),名称R.dimen
已更改为@ dimen / abc_action_bar_default_height_ material。
因此,从早期版本的支持库升级时,应使用该值作为操作栏的高度
?attr/actionBarSize
如果有人想匹配常规的话,这肯定胜过ActionBar
。
如果使用ActionBarSherlock,则可以使用
@dimen/abs__action_bar_default_height
abs__
直接使用-prefixed资源。
@ AZ13的答案很好,但是根据Android设计指南,ActionBar的高度至少应为48dp。
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;
}
我以这种方式为自己做,这种辅助方法应该对某人有用:
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;
}