Ответы:
Чтобы получить высоту ActionBar в XML, просто используйте
?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). Но попытка получить это значение на Samsung Galaxy SIII вернула мне неправильное значение. Это потому, что values-xlarge
(как-то) предпочтительнее, чем values-land
в ландшафтном режиме. Ссылка на атрибут вместо этого работает как шарм.
android.R.attr.actionBarSize
разрешит до 0 размер на устройствах до 3.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);
Один из образцов Сота относится к ?android:attr/actionBarSize
?attr/actionBarSize
(обратите внимание на отсутствие пространства имен Android), который работает на всех уровнях API.
Мне нужно было правильно реплицировать эти высоты в приложении совместимости до ICS и вкопаться в основной источник фреймворка. . Оба ответа выше верны.
Это в основном сводится к использованию квалификаторов. Высота определяется измерением "action_bar_default_height"
По умолчанию он равен 48dip. Но для -land это 40dip, а для sw600dp - 56dip.
Если вы используете ActionBar совместимости из недавнего пакета поддержки app7 v7, вы можете получить высоту, используя
@dimen/abc_action_bar_default_height
С новой библиотекой поддержки v7 (21.0.0) имя в R.dimen
изменилось на @ dimension / abc_action_bar_default_height_ material .
Поэтому при обновлении с предыдущей версии библиотеки поддержки следует использовать это значение в качестве высоты панели действий.
?attr/actionBarSize
если вы ищете, чтобы соответствовать регулярному ActionBar
.
Если вы используете ActionBarSherlock, вы можете получить высоту с
@dimen/abs__action_bar_default_height
abs__
ресурсы с префиксами напрямую.
@ 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;
}
Краткое описание класса , как правило , хорошее место , чтобы начать. Я думаю, что метод getHeight () должно быть достаточно.
РЕДАКТИРОВАТЬ:
Если вам нужна ширина, она должна быть шириной экрана (верно?), И это можно собрать следующим образом .
На моем Galaxy S4, имеющем> 441 точек на дюйм> 1080 x 1920> Получение высоты Actionbar с помощью getResources (). GetDimensionPixelSize Я получил 144 пикселя.
Используя формулу px = dp x (dpi / 160), я использовал 441dpi, тогда как мое устройство
относится к категории 480dpi. так что это подтверждает результат.
Я сделал таким образом для себя, этот вспомогательный метод должен пригодиться кому-то:
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;
}