Antworten:
Verwenden Sie einfach, um die Höhe der ActionBar in XML abzurufen
?android:attr/actionBarSize
oder wenn Sie ein ActionBarSherlock- oder AppCompat-Benutzer sind, verwenden Sie dies
?attr/actionBarSize
Wenn Sie diesen Wert zur Laufzeit benötigen, verwenden Sie diesen
final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
Wenn Sie verstehen müssen, wo dies definiert ist:
@dimen/abc_action_bar_default_height
direkt zu verwenden (ActionBarComapt) und es hat funktioniert (auf mdpi-Gerät). Der Versuch, diesen Wert auf dem Samsung Galaxy SIII zu erhalten, ergab jedoch einen falschen Wert. Das liegt daran, dass values-xlarge
(irgendwie) mehr bevorzugt wird als values-land
im Querformat. Das Verweisen auf das Attribut funktioniert stattdessen wie ein Zauber.
android.R.attr.actionBarSize
auf Geräten vor 3.0 die Größe 0 aufgelöst wird. Also bei der Verwendung ActionBarCompat
würde man android.support.v7.appcompat.R.attr.actionBarSize
stattdessen bleiben .
Aus den de-kompilierte Quellen von Android 3.2 ist framework-res.apk
, res/values/styles.xml
enthält:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 und 3.1 scheinen gleich zu sein (zumindest von AOSP) ...
Um die tatsächliche Höhe der Aktionsleiste zu ermitteln, müssen Sie das Attribut actionBarSize
zur Laufzeit auflösen .
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Eine der Wabenproben bezieht sich auf ?android:attr/actionBarSize
?attr/actionBarSize
(beachten Sie das Fehlen des Android-Namespace), die auf allen API-Ebenen funktioniert.
Ich musste diese Höhen in einer Pre-ICS-Kompatibilitäts-App ordnungsgemäß replizieren und in die Framework -Kernquelle graben . Beide Antworten oben sind irgendwie richtig.
Im Grunde läuft es darauf hinaus, Qualifikanten zu verwenden. Die Höhe wird durch die Dimension "action_bar_default_height" definiert.
Es ist standardmäßig auf 48dip definiert. Aber für -land ist es 40dip und für sw600dp ist es 56dip.
Wenn Sie die Kompatibilitäts-ActionBar aus dem aktuellen Support-Paket für v7-Appcompat verwenden, können Sie die Höhe mithilfe von ermitteln
@dimen/abc_action_bar_default_height
Mit der neuen Version 7 Support - Bibliothek (21.0.0) den Namen in R.dimen
hat sich geändert @ Dimen / abc_action_bar_default_height_ Material .
Wenn Sie ein Upgrade von einer früheren Version der Support-Bibliothek durchführen, sollten Sie diesen Wert daher als Höhe der Aktionsleiste verwenden
?attr/actionBarSize
wenn man nach einem Stammspieler sucht ActionBar
.
Wenn Sie ActionBarSherlock verwenden, können Sie die Höhe mit ermitteln
@dimen/abs__action_bar_default_height
abs__
vorfixierten Ressourcen direkt.
Die Antwort von @ AZ13 ist gut, aber gemäß den Android-Designrichtlinien sollte die ActionBar mindestens 48 dp hoch sein .
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;
}
Die Klassenzusammenfassung ist normalerweise ein guter Anfang. Ich denke, die getHeight () -Methode sollte ausreichen.
BEARBEITEN:
Wenn Sie die Breite benötigen, sollte es die Breite des Bildschirms (oder?) Sein und das kann gesammelt werden wie folgt .
Auf meinem Galaxy S4 mit> 441 dpi> 1080 x 1920> Abrufen der Actionbar-Höhe mit getResources (). GetDimensionPixelSize Ich habe 144 Pixel.
Mit der Formel px = dp x (dpi / 160) habe ich 441 dpi verwendet, während mein Gerät
in der Kategorie 480 dpi liegt . Das bestätigt das Ergebnis.
Ich habe es auf diese Weise für mich getan, diese Hilfsmethode sollte für jemanden nützlich sein:
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;
}