Odpowiedzi:
Aby pobrać wysokość ActionBar w XML, wystarczy użyć
?android:attr/actionBarSize
lub jeśli jesteś użytkownikiem ActionBarSherlock lub AppCompat, użyj tego
?attr/actionBarSize
Jeśli potrzebujesz tej wartości w czasie wykonywania, użyj jej
final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
Jeśli chcesz zrozumieć, gdzie to jest zdefiniowane:
@dimen/abc_action_bar_default_height
bezpośrednio (ActionBarComapt) i zadziałało (na urządzeniu mdpi). Ale próba uzyskania tej wartości na Samsungu Galaxy SIII zwróciła mi złą wartość. Jest tak, ponieważ values-xlarge
(jakoś) jest bardziej preferowany niż values-land
w trybie poziomym. Odwołanie się do atrybutu działa jak urok.
android.R.attr.actionBarSize
rozwiąże się do rozmiaru 0 na urządzeniach starszych niż 3.0. Więc podczas korzystania z ActionBarCompat
nich trzymaj się android.support.v7.appcompat.R.attr.actionBarSize
zamiast tego.
Z de skompilowane źródeł Android 3.2 roku framework-res.apk
, res/values/styles.xml
zawiera:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 i 3.1 wydają się być takie same (przynajmniej z AOSP) ...
Aby uzyskać rzeczywistą wysokość paska akcji, musisz rozwiązać atrybut actionBarSize
w czasie wykonywania.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Jedna z próbek o strukturze plastra miodu dotyczy ?android:attr/actionBarSize
?attr/actionBarSize
(zauważ brak przestrzeni nazw Androida), który działa na wszystkich poziomach API.
Musiałem poprawnie powtórzyć te wysokości w aplikacji kompatybilnej przed ICS i wkopać się w źródło rdzenia frameworka . Obie powyższe odpowiedzi są w pewnym sensie poprawne.
Zasadniczo sprowadza się to do użycia kwalifikatorów. Wysokość jest zdefiniowana przez wymiar „action_bar_default_height”
Domyślnie jest on ustawiony na 48dip. Ale dla -landa jest to 40dip, a dla sw600dp 56dip.
Jeśli korzystasz z paska ActionScript kompatybilności z najnowszego pakietu obsługi appcompat v7, możesz uzyskać wysokość za pomocą
@dimen/abc_action_bar_default_height
Z nową biblioteką wsparcia v7 (21.0.0) nazwa w R.dimen
zmieniła się na @ dimen / abc_action_bar_default_height_ materiał .
Podczas aktualizacji z poprzedniej wersji biblioteki wsparcia powinieneś użyć tej wartości jako wysokości paska akcji
?attr/actionBarSize
jeśli ktoś chce dopasować regularne ActionBar
.
Jeśli używasz ActionBarSherlock, możesz uzyskać wysokość za pomocą
@dimen/abs__action_bar_default_height
abs__
bezpośrednio prefiksowanych zasobów.
Odpowiedź AZ13 jest dobra, ale zgodnie z wytycznymi projektowymi Androida pasek Actionbar powinien mieć co najmniej 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;
}
Klasa Podsumowanie jest zazwyczaj dobrym miejscem, aby rozpocząć. Myślę, że metoda getHeight () powinna wystarczyć.
EDYTOWAĆ:
Jeśli potrzebujesz szerokości, powinna to być szerokość ekranu (prawda?), Którą można zebrać w ten sposób .
Na moim Galaxy S4 o> 441dpi> 1080 x 1920> Pobieranie wysokości paska akcji za pomocą getResources (). GetDimensionPixelSize Mam 144 piksele.
Używając wzoru px = dp x (dpi / 160), używałem 441dpi, podczas gdy moje urządzenie należy
do kategorii 480dpi. więc wprowadzenie to potwierdza wynik.
Zrobiłem w ten sposób dla siebie, ta metoda pomocnicza powinna się przydać komuś:
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;
}