Jaki jest rozmiar ActionBar w pikselach?

Odpowiedzi:

558

Aby pobrać wysokość ActionBar w XML, wystarczy użyć

?android:attr/actionBarSize

lub jeśli jesteś użytkownikiem ActionBarSherlock lub AppCompat, użyj tego

?attr/actionBarSize

Jeśli potrzebujesz tej wartości w czasie wykonywania, użyj jej

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

Jeśli chcesz zrozumieć, gdzie to jest zdefiniowane:

  1. Sama nazwa atrybutu jest zdefiniowana w /res/values/attrs.xml platformy
  2. Platforma themes.xml wybiera ten atrybut i przypisuje mu wartość.
  3. Wartość przypisana w kroku 2 zależy od różnych rozmiarów urządzeń, które są zdefiniowane w różnych plikach dimens.xml na platformie, tj. core / res / res / values-sw600dp / dimens.xml
AZ13
źródło
7
Świetna odpowiedź. Znam sposób na wykopanie tych informacji, ale przeszukanie tej odpowiedzi było znacznie szybsze +1. Twoja odpowiedź jest także świetną wskazówką, jak szukać takich rzeczy.
rekire
1
Dziękuję Ci. Próbowałem użyć @dimen/abc_action_bar_default_heightbezpośrednio (ActionBarComapt) i zadziałało (na urządzeniu mdpi). Ale próba uzyskania tej wartości na Samsungu Galaxy SIII zwróciła mi złą wartość. Jest tak, ponieważ values-xlarge(jakoś) jest bardziej preferowany niż values-landw trybie poziomym. Odwołanie się do atrybutu działa jak urok.
Alex Semeniuk
4
@ AZ13 Chciałbym dodać, że android.R.attr.actionBarSizerozwiąże się do rozmiaru 0 na urządzeniach starszych niż 3.0. Więc podczas korzystania z ActionBarCompatnich trzymaj się android.support.v7.appcompat.R.attr.actionBarSizezamiast tego.
Drew
1
Facet zapytał o to w pikselach. Przypuszczam, że actionBarSize zwraca wartość dp. Mam wartość 48dp. Oznacza to, że konwersja do pikseli daje 96 pikseli dla xhdpi.
Muhammad
„android.R.attr.actionBarSize” nie działa w Androidzie w wersji 2.3, ale „R.attr.actionBarSize” działa we wszystkich wersjach Androida. wystarczy użyć „R.attr.actionBarSize” zamiast „android.R.attr.actionBarSize” itp.
Nathaniel Jobs
59

Z de skompilowane źródeł Android 3.2 roku framework-res.apk, res/values/styles.xmlzawiera:

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

3.0 i 3.1 wydają się być takie same (przynajmniej z AOSP) ...

Jake Wharton
źródło
1
Co z różną wysokością paska akcji w krajobrazie?
Manfred Moser
86
w wersji 4.0+: domyślnie jest to 48dp, krajobraz to 40dp, sw600dp to 56dp
Jake Wharton
19
Dlatego powinieneś używać Androida: wartość attr, a nie wartość zakodowana na stałe!
Vikram Bodicherla
45

Aby uzyskać rzeczywistą wysokość paska akcji, musisz rozwiązać atrybut actionBarSizew czasie wykonywania.

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
David Boho
źródło
33

Jedna z próbek o strukturze plastra miodu dotyczy ?android:attr/actionBarSize

Vikram Bodicherla
źródło
3
Tak, wyjaśniono tutaj: developer.android.com/guide/topics/ui/…
Pointer Null
3
Oto odpowiedź, jeśli twoje min sdk wynosi> = 11, jeśli min to <11, najprawdopodobniej używasz ABS, to jest rozwiązanie: @ dimen / abs__action_bar_default_height
Adam
9
ABS ma ?attr/actionBarSize(zauważ brak przestrzeni nazw Androida), który działa na wszystkich poziomach API.
Jake Wharton
21

Musiałem poprawnie powtórzyć te wysokości w aplikacji kompatybilnej przed ICS i wkopać się w źródło rdzenia frameworka . Obie powyższe odpowiedzi są w pewnym sensie poprawne.

Zasadniczo sprowadza się to do użycia kwalifikatorów. Wysokość jest zdefiniowana przez wymiar „action_bar_default_height”

Domyślnie jest on ustawiony na 48dip. Ale dla -landa jest to 40dip, a dla sw600dp 56dip.

Manfred Moser
źródło
17

Jeśli korzystasz z paska ActionScript kompatybilności z najnowszego pakietu obsługi appcompat v7, możesz uzyskać wysokość za pomocą

@dimen/abc_action_bar_default_height

Dokumentacja

Flawedmatrix
źródło
9

Jeśli używasz ActionBarSherlock, możesz uzyskać wysokość za pomocą

@dimen/abs__action_bar_default_height
Jesper B.
źródło
Nie używaj abs__bezpośrednio prefiksowanych zasobów.
Jake Wharton
2
@JakeWharton, powiedz nam, jak to zrobić poprawnie.
JesperB
Stwórz swój własny wymiar, abyś nie był zależny od abs_.
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
źródło
0

Klasa Podsumowanie jest zazwyczaj dobrym miejscem, aby rozpocząć. Myślę, że metoda getHeight () powinna wystarczyć.

EDYTOWAĆ:

Jeśli potrzebujesz szerokości, powinna to być szerokość ekranu (prawda?), Którą można zebrać w ten sposób .

Matt
źródło
2
Dziwne - getHeight () powoduje zero.
Eugene
1
w moim rozwoju zauważyłem, że zwraca on zero w onResume (). Hovever wywołujący getActionBar (). GetHeight (), gdy faktycznie potrzebujesz, zwraca wartość dodatnią> 0.
TOS
@tos spec dla getHeight () mówi, że zwraca bieżącą szerokość dla ActionBar, która prawdopodobnie wynosi 0, gdy widok jest tworzony
Nazwa wyświetlana
0

Na moim Galaxy S4 o> 441dpi> 1080 x 1920> Pobieranie wysokości paska akcji za pomocą getResources (). GetDimensionPixelSize Mam 144 piksele.

Używając wzoru px = dp x (dpi / 160), używałem 441dpi, podczas gdy moje urządzenie należy
do kategorii 480dpi. więc wprowadzenie to potwierdza wynik.

Mahomet
źródło
0

Zrobiłem w ten sposób dla siebie, ta metoda pomocnicza powinna się przydać komuś:

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
źródło