Qual è la dimensione di ActionBar in pixel?


266

Ho bisogno di conoscere la dimensione esatta di ActionBar in pixel in modo da applicare l'immagine di sfondo corretta.

Risposte:


567

Per recuperare l'altezza di ActionBar in XML, basta usare

?android:attr/actionBarSize

o se sei un utente di ActionBarSherlock o AppCompat, usa questo

?attr/actionBarSize

Se hai bisogno di questo valore in fase di esecuzione, usa questo

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

Se hai bisogno di capire dove viene definito:

  1. Il nome dell'attributo stesso è definito in /res/values/attrs.xml della piattaforma
  2. Il theme.xml della piattaforma seleziona questo attributo e gli assegna un valore.
  3. Il valore assegnato nel passaggio 2 dipende dalle diverse dimensioni del dispositivo, che sono definite in vari file dimens.xml nella piattaforma, ad es. core / res / res / values-sw600dp / dimens.xml

7
Bella risposta. Conosco il modo per scavare queste informazioni, ma cercare questa risposta è stato molto più veloce +1. La tua risposta è anche un ottimo suggerimento su come cercare queste cose.
rekire

1
Grazie. Stavo cercando di usare @dimen/abc_action_bar_default_heightdirettamente (ActionBarComapt) e ha funzionato (sul dispositivo mdpi). Ma cercando di ottenere questo valore su Samsung Galaxy SIII mi ha restituito un valore sbagliato. Questo perché values-xlarge(in qualche modo) è più preferito rispetto values-landalla modalità orizzontale. Fare riferimento all'attributo invece funziona come un fascino.
Alex Semeniuk

4
@ AZ13 Vorrei aggiungere che android.R.attr.actionBarSizesi risolverà a 0 dimensioni su dispositivi pre-3.0. Quindi, quando ne usi ActionBarCompatuno, ti atterrai a android.support.v7.appcompat.R.attr.actionBarSize.
Drew

1
Il ragazzo l'ha chiesto in pixel. Suppongo che actionBarSize restituisca il valore dp. Ho ottenuto il valore 48dp. Ciò significa che convertirlo in pixel mi dà 96 pixel per xhdpi.
Muhammad

"android.R.attr.actionBarSize" non funziona nella versione 2.3 di Android, ma "R.attr.actionBarSize" funziona con tutte le versioni di Android. basta usare "R.attr.actionBarSize" invece di "android.R.attr.actionBarSize" e così via
Nathaniel Jobs,

59

Dai sorgenti de-compilati di Android 3.2 framework-res.apk, res/values/styles.xmlcontiene:

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

3.0 e 3.1 sembrano essere gli stessi (almeno da AOSP) ...


1
E la diversa altezza della barra delle azioni nel paesaggio?
Manfred Moser

87
su 4.0+: l'impostazione predefinita è 48dp, orizzontale è 40dp, sw600dp è 56dp
Jake Wharton

19
Ecco perché dovresti usare Android: attr value e non un valore hardcoded!
Vikram Bodicherla

46

Per ottenere l'altezza effettiva della barra delle azioni, è necessario risolvere l'attributo actionBarSizein fase di esecuzione.

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

34

Uno degli esempi Honeycomb si riferisce a ?android:attr/actionBarSize



3
Questa è la risposta se il tuo min sdk è> = 11, se il tuo min è <11, allora molto probabilmente stai usando ABS, allora questa è la soluzione: @ dimen / abs__action_bar_default_height
Adam

9
ABS ha ?attr/actionBarSize(nota la mancanza di spazio dei nomi Android) che funziona su tutti i livelli API.
Jake Wharton

21

Avevo bisogno di replicare correttamente queste altezze in un'app di compatibilità pre-ICS e scavare nella fonte principale del framework . Entrambe le risposte sopra sono in qualche modo corrette.

Fondamentalmente si riduce all'uso di qualificatori. L'altezza è definita dalla dimensione "action_bar_default_height"

È definito a 48dip per impostazione predefinita. Ma per -land è 40dip e per sw600dp è 56dip.


17

Se stai usando la ActionBar per la compatibilità dal recente pacchetto di supporto appcompat v7, puoi ottenere l'altezza usando

@dimen/abc_action_bar_default_height

Documentazione



9

Se stai usando ActionBarSherlock, puoi ottenere l'altezza con

@dimen/abs__action_bar_default_height

Non utilizzare abs__direttamente risorse -prefixed.
Jake Wharton

2
@JakeWharton per favore dicci come farlo correttamente, allora.
JesperB

Crea la tua dimensione in modo da non dipendere da 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;
}

0

Il sommario della classe è solitamente un buon punto di partenza. Penso che il metodo getHeight () dovrebbe essere sufficiente.

MODIFICARE:

Se hai bisogno della larghezza, dovrebbe essere la larghezza dello schermo (giusto?) E che può essere raccolta in questo modo .


2
Strano: getHeight () restituisce zero.
Eugene

1
nel mio sviluppo, ho notato che restituisce zero in onResume (). Ogni volta che si chiama getActionBar (). GetHeight () quando ne hai effettivamente bisogno, restituisce un valore positivo> 0.
TOS

@tos la specifica per getHeight () dice che restituisce la larghezza corrente per ActionBar, che probabilmente è 0 quando viene creata la vista
Nome visualizzato

0

Sul mio Galaxy S4 con> 441 dpi> 1080 x 1920> Ottenere l'altezza della barra delle azioni con getResources (). GetDimensionPixelSize Ho ottenuto 144 pixel.

Usando la formula px = dp x (dpi / 160), stavo usando 441dpi, mentre il mio dispositivo si trova
nella categoria 480dpi. così mettere che conferma il risultato.


0

L'ho fatto in questo modo per me stesso, questo metodo di supporto dovrebbe tornare utile per qualcuno:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.