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.