Відповіді:
Щоб отримати висоту 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 сумісності з недавнього пакета підтримки v7 appcompat, ви можете отримати висоту, використовуючи
@dimen/abc_action_bar_default_height
За допомогою нової бібліотеки підтримки v7 (21.0.0) ім'я в R.dimen
змінився на @ DIMEN / abc_action_bar_default_height_ матеріалу .
Таким чином, під час оновлення до попередньої версії вкладки підтримки слід використовувати це значення як висоту панелі дій
?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 з> 441dpi> 1080 x 1920> Отримання висоти панелі дій з 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;
}