Який розмір 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. Platform. themes.xml вибирає цей атрибут і присвоює йому значення.
  3. Значення, призначене на кроці 2, залежить від різних розмірів пристрою, які визначені у різних файлах dimens.xml на платформі, тобто.core / res / res / values-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
on 4.0+: за замовчуванням 48dp, пейзаж - 40dp, sw600dp - 56dp
Джейк Уортон

19
Ось чому ви повинні використовувати android: attr значення, а не твердо кодоване значення!
Vikram Bodicherla

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, тоді це рішення: @ dimen / abs__action_bar_default_height
Адам

9
ABS має ?attr/actionBarSize(зверніть увагу на відсутність простору імен для Android), який працює на всіх рівнях API.
Джейк Уортон

21

Мені потрібно було належним чином повторити ці висоти в додатку сумісності до ICS та викопатись у базовому джерелі . Обидві відповіді вище є своєрідними.

Це в основному зводиться до використання кваліфікаторів. Висота визначається розміром "action_bar_default_height"

За замовчуванням визначено 48dip. Але для -land це 40dip, а для sw600dp - 56dip.



16

За допомогою нової бібліотеки підтримки v7 (21.0.0) ім'я в R.dimenзмінився на @ DIMEN / abc_action_bar_default_height_ матеріалу .

Таким чином, під час оновлення до попередньої версії вкладки підтримки слід використовувати це значення як висоту панелі дій


1
Ідеально! Це впевнено перемагає, ?attr/actionBarSizeякщо хтось хоче відповідати звичайному ActionBar.
karllindmark

9

Якщо ви використовуєте ActionBarSherlock, ви можете отримати висоту за допомогою

@dimen/abs__action_bar_default_height

Не використовуйте abs__безпосередньо встановлені ресурси.
Джейк Уортон

2
@JakeWharton, будь ласка, скажіть нам, як це зробити правильно замість цього.
JesperB

Створіть свій власний вимір, щоб ви не залежали від abs_.
Зашифрований


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 (). Виклик курсора getActionBar (). GetHeight (), коли вам це потрібно, повертає додатне значення> 0.
тос

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

0

На моєму Galaxy S4 з> 441dpi> 1080 x 1920> Отримання висоти панелі дій з 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.