Каков размер ActionBar в пикселях?


Ответы:


558

Чтобы получить высоту 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();

Если вам нужно понять, где это определяется:

  1. Само имя атрибута определено в платформе /res/values/attrs.xml
  2. Платформа themes.xml выбирает этот атрибут и присваивает ему значение.
  3. Значение, назначенное на шаге 2, зависит от разных размеров устройства, которые определены в различных файлах измерения .xml на платформе, т.е. Основные / RES / RES / значения-sw600dp / dimens.xml

7
Отличный ответ. Я знаю, как копать эту информацию, но поиск этого ответа был намного быстрее +1. Ваш ответ также является отличным советом, как искать такие вещи.
rekire

1
Спасибо. Я пытался использовать @dimen/abc_action_bar_default_heightнапрямую (ActionBarComapt), и это работало (на устройстве mdpi). Но попытка получить это значение на Samsung Galaxy SIII вернула мне неправильное значение. Это потому, что values-xlarge(как-то) предпочтительнее, чем values-landв ландшафтном режиме. Ссылка на атрибут вместо этого работает как шарм.
Алекс Семенюк

4
@ AZ13 Я хотел бы добавить, что android.R.attr.actionBarSizeразрешит до 0 размер на устройствах до 3.0. Так что при использовании ActionBarCompatодного придерживаться android.support.v7.appcompat.R.attr.actionBarSizeвместо.
Дрю

1
Парень спросил это в пикселях. Я полагаю, actionBarSize возвращает значение dp. Я получил значение 48dp. Это означает, что преобразование его в пиксели дает мне 96 пикселей для xhdpi.
Мухаммед

«android.R.attr.actionBarSize» не работает в версии 2.3 для Android, но «R.attr.actionBarSize» работает для всех версий Android. просто используйте «R.attr.actionBarSize» вместо «android.R.attr.actionBarSize» и т. д.
Натаниэль Джобс

59

Из декомпилированных источников 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) ...


1
Как насчет различной высоты панели действий в ландшафте?
Манфред Мозер

86
на 4.0+: по умолчанию 48dp, ландшафт - 40dp, sw600dp - 56dp
Джейк Уортон

19
Вот почему вы должны использовать значение android: attr, а не жестко закодированное значение!
Викрам Бодичерла

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
Это ответ, если ваш min sdk> = 11, если ваш min меньше <11, то, скорее всего, вы используете ABS, тогда это решение: @ Измерение / abs__action_bar_default_height
Адам

9
ABS имеет ?attr/actionBarSize(обратите внимание на отсутствие пространства имен Android), который работает на всех уровнях API.
Джейк Уортон

21

Мне нужно было правильно реплицировать эти высоты в приложении совместимости до ICS и вкопаться в основной источник фреймворка. . Оба ответа выше верны.

Это в основном сводится к использованию квалификаторов. Высота определяется измерением "action_bar_default_height"

По умолчанию он равен 48dip. Но для -land это 40dip, а для sw600dp - 56dip.


17

Если вы используете ActionBar совместимости из недавнего пакета поддержки app7 v7, вы можете получить высоту, используя

@dimen/abc_action_bar_default_height

Документация


16

С новой библиотекой поддержки v7 (21.0.0) имя в R.dimenизменилось на @ dimension / abc_action_bar_default_height_ material .

Поэтому при обновлении с предыдущей версии библиотеки поддержки следует использовать это значение в качестве высоты панели действий.


1
Отлично! Это, безусловно, лучше, ?attr/actionBarSizeесли вы ищете, чтобы соответствовать регулярному ActionBar.
karllindmark

9

Если вы используете ActionBarSherlock, вы можете получить высоту с

@dimen/abs__action_bar_default_height

Не используйте abs__ресурсы с префиксами напрямую.
Джейк Уортон

2
@ JakeWharton, пожалуйста, расскажи нам, как сделать это правильно, тогда.
JesperB

Создайте свое собственное измерение, чтобы вы не зависели от abs_.
Codeversed


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 (). Hovever вызывает getActionBar (). GetHeight (), когда вам это действительно нужно, возвращает положительное значение> 0.
тос

@tos спецификация для getHeight () говорит, что она возвращает текущую ширину для ActionBar, которая, вероятно, равна 0 при создании представления
Отображаемое имя

0

На моем Galaxy S4, имеющем> 441 точек на дюйм> 1080 x 1920> Получение высоты Actionbar с помощью 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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.