Respostas:
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:
@dimen/abc_action_bar_default_height
diretamente (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-land
quando está no modo paisagem. A referência ao atributo funciona como um encanto.
android.R.attr.actionBarSize
resolverá o tamanho 0 em dispositivos anteriores à 3.0. Portanto, ao usar ActionBarCompat
um, você prefere ficar android.support.v7.appcompat.R.attr.actionBarSize
.
Das fontes descompiladas do Android 3.2 framework-res.apk
, res/values/styles.xml
conté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) ...
Para obter a altura real da barra de ação, é necessário resolver o atributo actionBarSize
no tempo de execução.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Uma das amostras do favo de mel refere-se a ?android:attr/actionBarSize
?attr/actionBarSize
(observe a falta de espaço para nome do Android) que funciona em todos os níveis da API.
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.
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
Com a nova biblioteca de suporte da v7 (21.0.0), o nome R.dimen
mudou para @ dimen / abc_action_bar_default_height_ material .
Ao atualizar de uma versão anterior da lib de suporte, você deve, portanto, usar esse valor como a altura da barra de ação
?attr/actionBarSize
é melhor do que se você quer combinar com um regular ActionBar
.
Se você estiver usando o ActionBarSherlock, poderá obter a altura com
@dimen/abs__action_bar_default_height
abs__
recursos prefixados diretamente.
A resposta do @ AZ13 é boa, mas de acordo com as diretrizes de design do Android , o ActionBar deve ter pelo menos 48dp de altura .
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;
}
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 .
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.
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;
}