Wie groß ist ActionBar in Pixel?

Antworten:

558

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:

  1. Der Attributname selbst ist in der Datei /res/values/attrs.xml der Plattform definiert
  2. Die Datei theme.xml der Plattform wählt dieses Attribut aus und weist ihm einen Wert zu.
  3. Der in Schritt 2 zugewiesene Wert hängt von verschiedenen Gerätegrößen ab, die in verschiedenen dimension.xml-Dateien auf der Plattform definiert sind, d. H. core / res / res / values-sw600dp / dimension.xml
AZ13
quelle
7
Gute Antwort. Ich kenne den Weg, um diese Informationen zu graben, aber diese Antwort zu suchen war viel schneller +1. Ihre Antwort ist auch ein guter Hinweis, wie man solche Dinge sucht.
rekire
1
Danke dir. Ich habe versucht, @dimen/abc_action_bar_default_heightdirekt 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-landim Querformat. Das Verweisen auf das Attribut funktioniert stattdessen wie ein Zauber.
Alex Semeniuk
4
@ AZ13 Ich möchte hinzufügen, dass android.R.attr.actionBarSizeauf Geräten vor 3.0 die Größe 0 aufgelöst wird. Also bei der Verwendung ActionBarCompatwürde man android.support.v7.appcompat.R.attr.actionBarSizestattdessen bleiben .
Drew
1
Der Typ fragte es in Pixel. Ich nehme an, actionBarSize gibt den dp-Wert zurück. Ich habe den Wert 48dp. Das bedeutet, dass die Konvertierung in Pixel 96 Pixel für xhdpi ergibt.
Muhammad
"android.R.attr.actionBarSize" funktioniert nicht in Android Version 2.3, aber "R.attr.actionBarSize" funktioniert in Android allen Versionen. Verwenden Sie einfach "R.attr.actionBarSize" anstelle von "android.R.attr.actionBarSize" usw.
Nathaniel Jobs
59

Aus den de-kompilierte Quellen von Android 3.2 ist framework-res.apk, res/values/styles.xmlenthält:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0 und 3.1 scheinen gleich zu sein (zumindest von AOSP) ...

Jake Wharton
quelle
1
Was ist mit der unterschiedlichen Höhe der Aktionsleiste in der Landschaft?
Manfred Moser
86
auf 4.0+: Standard ist 48dp, Landschaft ist 40dp, sw600dp ist 56dp
Jake Wharton
19
Aus diesem Grund sollten Sie den Wert android: attr und keinen fest codierten Wert verwenden!
Vikram Bodicherla
45

Um die tatsächliche Höhe der Aktionsleiste zu ermitteln, müssen Sie das Attribut actionBarSizezur Laufzeit auflösen .

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
David Boho
quelle
33

Eine der Wabenproben bezieht sich auf ?android:attr/actionBarSize

Vikram Bodicherla
quelle
3
Ja, hier erklärt: developer.android.com/guide/topics/ui/…
Zeiger Null
3
Dies ist die Antwort, wenn Ihr min sdk> = 11 ist, wenn Ihr min sd <11 ist, dann verwenden Sie höchstwahrscheinlich ABS, dann ist dies die Lösung: @ dimen / abs__action_bar_default_height
Adam
9
ABS hat ?attr/actionBarSize(beachten Sie das Fehlen des Android-Namespace), die auf allen API-Ebenen funktioniert.
Jake Wharton
21

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.

Manfred Moser
quelle
17

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

Dokumentation

fehlerhafte Matrix
quelle
16

Mit der neuen Version 7 Support - Bibliothek (21.0.0) den Namen in R.dimenhat 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

MrMaffen
quelle
1
Perfekt! Dies ist sicher besser, ?attr/actionBarSizewenn man nach einem Stammspieler sucht ActionBar.
Karllindmark
9

Wenn Sie ActionBarSherlock verwenden, können Sie die Höhe mit ermitteln

@dimen/abs__action_bar_default_height
JesperB
quelle
Verwenden Sie keine abs__vorfixierten Ressourcen direkt.
Jake Wharton
2
@JakeWharton, bitte sagen Sie uns stattdessen, wie es richtig gemacht wird.
JesperB
Erstellen Sie Ihre eigene Dimension, damit Sie nicht von abs_ abhängig sind.
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;
}
Md. Enamul Haque
quelle
0

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 .

Matt
quelle
2
Seltsam - getHeight () ergibt Null.
Eugene
1
In meiner Entwicklung habe ich festgestellt, dass in onResume () Null zurückgegeben wird. Wenn Sie jedoch getActionBar (). GetHeight () aufrufen, wenn Sie es tatsächlich benötigen, wird ein positiver Wert> 0 zurückgegeben.
tos
@tos Die Spezifikation für getHeight () gibt an, dass die aktuelle Breite für die ActionBar zurückgegeben wird, die beim Erstellen der Ansicht wahrscheinlich 0 ist
Anzeigename
0

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.

Muhammad
quelle
0

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;
}
Min2
quelle