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.