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.