ActionBar'ın piksel cinsinden boyutu nedir?


Yanıtlar:


558

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:

  1. Özellik adının kendisi platformun /res/values/attrs.xml dosyasında tanımlanır
  2. Platformun themes.xml dosyası bu özelliği seçer ve buna bir değer atar.
  3. 2. adımda atanan değer , platformdaki çeşitli dimens.xml dosyalarında , yani. Çekirdek / res / res / değerlere sw600dp / dimens.xml

7
Mükemmel cevap. Bu bilgileri kazmanın yolunu biliyorum, ama bu cevabı aramak çok daha hızlıydı +1. Cevabınız ayrıca bu tür şeyleri nasıl arayacağınıza dair harika bir ipucu.
— rekire

1
Teşekkür ederim. @dimen/abc_action_bar_default_heightDoğ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.
— Alex Semeniuk

4
@ AZ13 android.R.attr.actionBarSize3.0 öncesi cihazlarda 0 boyutuna çözülmesini eklemek istiyorum . Yani ActionBarCompatbirini kullanırken android.support.v7.appcompat.R.attr.actionBarSizeyerine yapışacaktı .
— Drew

1
Adam piksel olarak sordu. ActionBarSize'ın dp değerini döndürdüğünü varsayalım. 48dp değerini aldım. Bu, onu piksellere dönüştürmek demek bana xhdpi için 96 piksel veriyor.
— Muhammed

"android.R.attr.actionBarSize" android 2.3 sürümünde çalışmıyor, ancak "R.attr.actionBarSize" android tüm sürümü çalışıyor. "android.R.attr.actionBarSize" vb. yerine "R.attr.actionBarSize" kullanın.
— Nathaniel Jobs

59

Android 3.2 yılların de-derlenmiş kaynaklardan framework-res.apk, res/values/styles.xmliç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) ...


1
Peyzajdaki hareket çubuğunun farklı yüksekliği ne olacak?
— Manfred Moser

86
üzerinde 4.0+: varsayılan 48dp, manzara 40dp, sw600dp 56dp
— Jake Wharton

19
Bu yüzden android kullanmalısınız: attr değeri ve sabit kodlu bir değer değil!
— Vikram Bodicherla

45

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);


21

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.


17

Son sürüm v7 appcompat destek paketinden uyumluluk ActionBar kullanıyorsanız, yüksekliği kullanarak

@dimen/abc_action_bar_default_height

belgeleme



9

ActionBarSherlock kullanıyorsanız, yüksekliği

@dimen/abs__action_bar_default_height

abs__Önceden düzeltilmiş kaynakları doğrudan kullanmayın .
— Jake Wharton

2
@JakeWharton lütfen bunun yerine nasıl doğru yapılacağını bize bildirin.
— JesperB

Abs_'ye bağımlı kalmamak için kendi boyutunuzu oluşturun.
— 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

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 .


2
Garip - getHeight () sıfıra neden olur.
— Eugene

1
benim gelişimde, onResume () sıfır döndürdüğünü fark ettim. Hovever gerçekten ihtiyacınız olduğunda getActionBar (). GetHeight () çağrısı pozitif> 0 değerini döndürür.
— tos

@ getHeight () için spesifikasyon, görünüm oluşturulduğunda muhtemelen 0 olan ActionBar için geçerli genişliği döndürdüğünü söylüyor
— Görünen ad

0

Galaxy S4'ümde getResources () ile Actionbar yüksekliği elde etme> 441dpi> 1080 x 1920> getDimensionPixelSize 144 piksel aldım.

Px = dp x (dpi / 160) formülünü kullanarak 441 dpi kullanıyordum, cihazım ise
480dpi kategorisindeydi. bunu koymak sonucu doğrular.


0

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.