Каков размер ActionBar в пикселях? - PullRequest
248 голосов
/ 23 августа 2011

Мне нужно знать точный размер ActionBar в пикселях, чтобы применить правильное фоновое изображение.

Ответы [ 12 ]

527 голосов
/ 24 августа 2011

Чтобы получить высоту 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 в платформе, т.е. core / res / res / values-sw600dp / sizess.xml
54 голосов
/ 25 августа 2011

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

43 голосов
/ 23 октября 2012

Чтобы получить фактическую высоту панели действий, необходимо разрешить атрибут actionBarSize во время выполнения.

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
33 голосов
/ 26 сентября 2011

Один из образцов сота относится к ?android:attr/actionBarSize

21 голосов
/ 28 января 2012

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

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

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

17 голосов
/ 31 июля 2013

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

@dimen/abc_action_bar_default_height

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

16 голосов
/ 21 октября 2014

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

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

9 голосов
/ 20 марта 2013

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

@dimen/abs__action_bar_default_height
4 голосов
/ 26 июня 2012

@ AZ13 ответ хороший, но согласно рекомендациям по дизайну Android , ActionBar должен иметь минимум 48dp .

0 голосов
/ 11 января 2016

Я сделал таким образом для себя, этот вспомогательный метод должен пригодиться кому-то:

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