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

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) ...


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);

33

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



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.


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



9

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

@dimen/abs__action_bar_default_height

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

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 .


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.


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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.