Yanıtlar:
XML'de ActionBar'ın yüksekliğini almak için şunu kullanın:
?android:attr/actionBarSize
veya bir ActionBarSherlock veya AppCompat kullanıcısıysanız, bunu kullanın
?attr/actionBarSize
Çalışma zamanında bu değere ihtiyacınız varsa, bunu kullanın
final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
Bunun nerede tanımlandığını anlamanız gerekiyorsa:
@dimen/abc_action_bar_default_height
Doğrudan (ActionBarComapt) kullanmaya çalışıyordum ve (mdpi cihazında) çalıştı. Ancak Samsung Galaxy SIII'de bu değeri almaya çalışmak bana yanlış değer verdi. Çünkü manzara modundayken values-xlarge
(her nasılsa) daha çok tercih edilir values-land
. Özniteliğe başvurmak onun yerine bir cazibe gibi çalışır.
android.R.attr.actionBarSize
3.0 öncesi cihazlarda 0 boyutuna çözülmesini eklemek istiyorum . Yani ActionBarCompat
birini kullanırken android.support.v7.appcompat.R.attr.actionBarSize
yerine yapışacaktı .
Android 3.2 yılların de-derlenmiş kaynaklardan framework-res.apk
, res/values/styles.xml
içerir:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 ve 3.1 aynı görünüyor (en azından AOSP'den) ...
Eylem Çubuğunun gerçek yüksekliğini elde etmek için, özelliği actionBarSize
çalışma zamanında çözmeniz gerekir .
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Petek örneklerinden biri ?android:attr/actionBarSize
?attr/actionBarSize
tüm API seviyelerinde çalışan (android ad alanının eksikliğine dikkat edin) vardır.
ICS öncesi bir uyumluluk uygulamasında bu yükseklikleri düzgün bir şekilde kopyalamam ve çerçeve çekirdek kaynağına kazılmam gerekiyordu . Yukarıdaki her iki cevap da doğrudur.
Temel olarak niteleyiciler kullanmaya kaynar. Yükseklik, "action_bar_default_height" boyutuyla tanımlanır.
Varsayılan olarak 48dip olarak tanımlanmıştır. Ama -land için 40dip ve sw600dp için 56dip.
Son sürüm v7 appcompat destek paketinden uyumluluk ActionBar kullanıyorsanız, yüksekliği kullanarak
@dimen/abc_action_bar_default_height
Yeni ile v7 destek kitaplığı (21.0.0) 'de adı R.dimen
değişti @ Dimen / abc_action_bar_default_height_ malzeme .
Destek lib'in önceki bir sürümünden yükseltme yaparken bu değeri işlem çubuğunun yüksekliği olarak kullanmalısınız.
?attr/actionBarSize
, normal biriyle eşleşmek istiyorsa yener ActionBar
.
ActionBarSherlock kullanıyorsanız, yüksekliği
@dimen/abs__action_bar_default_height
abs__
Önceden düzeltilmiş kaynakları doğrudan kullanmayın .
@ AZ13'ün cevabı iyi, ancak Android tasarım yönergelerine göre , ActionBar'ın en az 48dp yüksekliğinde olması gerekir .
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;
}
Sınıf Özeti genellikle başlamak için iyi bir yerdir. Ben getHeight () yöntemi yeterli olması gerektiğini düşünüyorum.
DÜZENLE:
Eğer genişlik gerekiyorsa, ekranın genişliği (sağ?) Olmalı ve bu toplanan edilebilir böyle .
Bu şekilde kendim için yaptım, bu yardımcı yöntem birisi için kullanışlı olmalı:
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;
}