Qual é o tamanho do ActionBar em pixels?


Respostas:


558

Para recuperar a altura do ActionBar em XML, basta usar

?android:attr/actionBarSize

ou se você é um usuário do ActionBarSherlock ou AppCompat, use este

?attr/actionBarSize

Se você precisar desse valor em tempo de execução, use este

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

Se você precisar entender onde isso está definido:

  1. O nome do atributo em si é definido em /res/values/attrs.xml da plataforma
  2. O themes.xml da plataforma escolhe esse atributo e atribui um valor a ele.
  3. O valor designado na etapa 2 depende de diferentes tamanhos de dispositivo, definidos em vários arquivos dimens.xml na plataforma, ou seja. core / res / res / values-sw600dp / dimens.xml

7
Ótima resposta. Eu sei como descobrir essas informações, mas pesquisar essa resposta foi muito mais rápido +1. Sua resposta também é uma ótima dica de como pesquisar essas coisas.
rekire

1
Obrigado. Eu estava tentando usar @dimen/abc_action_bar_default_heightdiretamente (ActionBarComapt) e funcionou (no dispositivo mdpi). Mas tentar obter esse valor no Samsung Galaxy SIII me retornou um valor errado. Isso ocorre porque values-xlarge(de alguma forma) é mais preferido do que values-landquando está no modo paisagem. A referência ao atributo funciona como um encanto.
Alex Semeniuk

4
@ AZ13 Gostaria de acrescentar que android.R.attr.actionBarSizeresolverá o tamanho 0 em dispositivos anteriores à 3.0. Portanto, ao usar ActionBarCompatum, você prefere ficar android.support.v7.appcompat.R.attr.actionBarSize.
Drew

1
O cara perguntou em pixels. Suponho que actionBarSize retorne o valor dp. Eu tenho o valor 48dp. Isso significa que convertê-lo em pixels me dá 96 pixels para xhdpi.
Muhammad

"android.R.attr.actionBarSize" não está funcionando na versão 2.3 do Android, mas "R.attr.actionBarSize" está funcionando com Android em toda a versão. basta usar "R.attr.actionBarSize" em vez de "android.R.attr.actionBarSize" e etc. #
Nathaniel Jobs Jobs

59

Das fontes descompiladas do Android 3.2 framework-res.apk, res/values/styles.xmlcontém:

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

3.0 e 3.1 parecem ser os mesmos (pelo menos da AOSP) ...


1
E a altura diferente da barra de ação na paisagem?
Manfred Moser

86
em 4.0+: default é 48dp, paisagem é 40dp, sw600dp é 56dp
Jake Wharton

19
É por isso que você deve usar o android: attr value e não um valor codificado!
Vikram Bodicherla

45

Para obter a altura real da barra de ação, é necessário resolver o atributo actionBarSizeno tempo de execução.

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

33

Uma das amostras do favo de mel refere-se a ?android:attr/actionBarSize



3
Esta é a resposta se seu min sdk é> = 11, se você é min é <11, provavelmente você está usando ABS, então esta é a solução: @ dimen / abs__action_bar_default_height #
Adam

9
O ABS possui ?attr/actionBarSize(observe a falta de espaço para nome do Android) que funciona em todos os níveis da API.
Jake Wharton

21

Eu precisava replicar essas alturas corretamente em um aplicativo de compatibilidade pré-ICS e cavar a fonte principal da estrutura . Ambas as respostas acima estão corretas.

Basicamente, tudo se resume ao uso de qualificadores. A altura é definida pela dimensão "action_bar_default_height"

É definido como 48dip por padrão. Mas para -land é 40dip e para sw600dp é 56dip.


17

Se você estiver usando o ActionBar de compatibilidade do pacote de suporte para app7 v7 recente, poderá obter a altura usando

@dimen/abc_action_bar_default_height

Documentação



9

Se você estiver usando o ActionBarSherlock, poderá obter a altura com

@dimen/abs__action_bar_default_height

Não use abs__recursos prefixados diretamente.
Jake Wharton

2
@JakeWharton, diga-nos como fazê-lo corretamente.
JesperB

Crie sua própria dimensão para não depender de 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

O Resumo da turma é geralmente um bom ponto de partida. Eu acho que o método getHeight () deve ser suficiente.

EDITAR:

Se você precisar da largura, ela deve ser a largura da tela (certo?) E pode ser agrupada assim .


2
Estranho - getHeight () resulta em zero.
Eugene

1
no meu desenvolvimento, notei que ele retorna zero em onResume (). Sempre que chamar getActionBar (). GetHeight () quando você realmente precisar, retornará um valor positivo> 0.
11123

@tos, a especificação para o getHeight () diz que retorna a largura atual da ActionBar, que provavelmente é 0 quando a exibição é criada
Nome para exibição

0

No meu Galaxy S4 com> 441dpi> 1080 x 1920> Obtendo altura da Actionbar com getResources (). GetDimensionPixelSize Eu tenho 144 pixels.

Usando a fórmula px = dp x (dpi / 160), eu estava usando 441dpi, enquanto meu dispositivo está
na categoria 480dpi. colocando isso confirma o resultado.


0

Eu fiz dessa maneira por mim mesmo, esse método auxiliar deve ser útil para alguém:

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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.