Ho bisogno di conoscere la dimensione esatta di ActionBar in pixel in modo da applicare l'immagine di sfondo corretta.
Risposte:
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:
@dimen/abc_action_bar_default_height
direttamente (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-land
alla modalità orizzontale. Fare riferimento all'attributo invece funziona come un fascino.
android.R.attr.actionBarSize
si risolverà a 0 dimensioni su dispositivi pre-3.0. Quindi, quando ne usi ActionBarCompat
uno, ti atterrai a android.support.v7.appcompat.R.attr.actionBarSize
.
Dai sorgenti de-compilati di Android 3.2 framework-res.apk
, res/values/styles.xml
contiene:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 e 3.1 sembrano essere gli stessi (almeno da AOSP) ...
Per ottenere l'altezza effettiva della barra delle azioni, è necessario risolvere l'attributo actionBarSize
in fase di esecuzione.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Uno degli esempi Honeycomb si riferisce a ?android:attr/actionBarSize
?attr/actionBarSize
(nota la mancanza di spazio dei nomi Android) che funziona su tutti i livelli API.
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.
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
Con la nuova libreria di supporto v7 (21.0.0) il nome in R.dimen
è cambiato in @ dimen / abc_action_bar_default_height_ material .
Quando si aggiorna da una versione precedente della libreria di supporto, è quindi necessario utilizzare quel valore come altezza della barra delle azioni
?attr/actionBarSize
se si sta cercando di abbinare un normale ActionBar
.
Se stai usando ActionBarSherlock, puoi ottenere l'altezza con
@dimen/abs__action_bar_default_height
abs__
direttamente risorse -prefixed.
La risposta di @ AZ13 è buona, ma secondo le linee guida di progettazione Android , ActionBar dovrebbe essere alta almeno 48dp .
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;
}
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 .
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.
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;
}