Berapa ukuran ActionBar dalam piksel?

Jawaban:

558

Untuk mengambil ketinggian ActionBar di XML, cukup gunakan

?android:attr/actionBarSize

atau jika Anda pengguna ActionBarSherlock atau AppCompat, gunakan ini

?attr/actionBarSize

Jika Anda membutuhkan nilai ini saat runtime, gunakan ini

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

Jika Anda perlu memahami di mana ini didefinisikan:

  1. Nama atribut itu sendiri didefinisikan di /res/values/attrs.xml platform
  2. Themes.xml platform mengambil atribut ini dan memberikan nilai padanya.
  3. Nilai yang diberikan pada langkah 2 tergantung pada ukuran perangkat yang berbeda, yang didefinisikan dalam berbagai file dimens.xml di platform, yaitu. core / res / res / values-sw600dp / dimens.xml
AZ13
sumber
7
Jawaban yang bagus Saya tahu cara menggali informasi ini, tetapi untuk mencari jawaban ini jauh lebih cepat +1. Jawaban Anda juga merupakan petunjuk yang bagus bagaimana mencari hal-hal seperti itu.
rekire
1
Terima kasih. Saya mencoba menggunakan @dimen/abc_action_bar_default_heightsecara langsung (ActionBarComapt) dan berhasil (pada perangkat mdpi). Tetapi mencoba untuk mendapatkan nilai ini pada Samsung Galaxy SIII mengembalikan nilai yang salah kepada saya. Itu karena values-xlarge(entah bagaimana) lebih disukai daripada values-landketika dalam mode lansekap. Mengacu pada atribut sebagai gantinya bekerja seperti pesona.
Alex Semeniuk
4
@ AZ13 Saya ingin menambahkan yang android.R.attr.actionBarSizeakan menyelesaikan ke ukuran 0 pada perangkat pra-3.0. Jadi, ketika menggunakan ActionBarCompatsalah satu akan tetap android.support.v7.appcompat.R.attr.actionBarSizemenggunakannya.
Drew
1
Pria itu bertanya dalam piksel. Saya kira actionBarSize mengembalikan nilai dp. Saya mendapat nilai 48dp. Itu berarti mengonversinya menjadi piksel memberi saya 96 piksel untuk xhdpi.
Muhammad
"android.R.attr.actionBarSize" tidak berfungsi di android versi 2.3, tetapi "R.attr.actionBarSize" bekerja android semua versi. cukup gunakan "R.attr.actionBarSize" alih-alih "android.R.attr.actionBarSize" dan lain
Nathaniel Jobs
59

Dari sumber Android 3.2 yang tidak dikompilasi framework-res.apk, res/values/styles.xmlberisi:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0 dan 3.1 tampaknya sama (setidaknya dari AOSP) ...

Jake Wharton
sumber
1
Bagaimana dengan ketinggian berbeda dari action bar di lanskap?
Manfred Moser
86
pada 4.0+: default adalah 48dp, landscape adalah 40dp, sw600dp adalah 56dp
Jake Wharton
19
Itulah sebabnya Anda harus menggunakan nilai android: attr dan bukan nilai yang di-hardcode!
Vikram Bodicherla
45

Untuk mendapatkan ketinggian sebenarnya dari Actionbar, Anda harus menyelesaikan atribut actionBarSizesaat runtime.

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
David Boho
sumber
33

Salah satu contoh Honeycomb merujuk ?android:attr/actionBarSize

Vikram Bodicherla
sumber
3
Ya, dijelaskan di sini: developer.android.com/guide/topics/ui/…
Pointer Null
3
Ini adalah jawabannya jika min sdk Anda> = 11, jika Anda min adalah <11, maka kemungkinan besar Anda menggunakan ABS, maka ini solusinya: @ dimen / abs__action_bar_default_height
Adam
9
ABS memiliki ?attr/actionBarSize(perhatikan kurangnya namespace android) yang bekerja pada semua level API.
Jake Wharton
21

Saya perlu melakukan replikasi ketinggian ini dengan benar dalam aplikasi kompatibilitas pra-ICS dan menggali sumber inti kerangka kerja . Kedua jawaban di atas agak benar.

Pada dasarnya bermuara pada menggunakan kualifikasi. Ketinggiannya ditentukan oleh dimensi "action_bar_default_height"

Ini didefinisikan untuk 48dip untuk default. Tapi untuk -land adalah 40dip dan untuk sw600dp 56dip.

Manfred Moser
sumber
17

Jika Anda menggunakan ActionBar kompatibilitas dari paket dukungan appcompat v7 baru-baru ini, Anda bisa mendapatkan ketinggian menggunakan

@dimen/abc_action_bar_default_height

Dokumentasi

flawedmatrix
sumber
16

Dengan pustaka dukungan v7 baru (21.0.0) nama di R.dimentelah berubah menjadi @ dimen / abc_action_bar_default_height_ material .

Saat memutakhirkan dari versi lib dukungan sebelumnya, Anda harus menggunakan nilai itu sebagai tinggi bilah tindakan

MrMaffen
sumber
1
Sempurna! Ini pasti mengalahkan ?attr/actionBarSizejika seseorang mencari yang cocok dengan yang biasa ActionBar.
karllindmark
9

Jika Anda menggunakan ActionBarSherlock, Anda bisa mendapatkan ketinggiannya

@dimen/abs__action_bar_default_height
JesperB
sumber
Jangan gunakan abs__sumber daya -prefixed secara langsung.
Jake Wharton
2
@JakeWharton tolong beri tahu kami bagaimana cara melakukannya dengan benar.
JesperB
Buat dimensi Anda sendiri sehingga Anda tidak bergantung pada abs_.
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;
}
Md. Enamul Haque
sumber
0

The Kelas Ringkasan biasanya tempat yang baik untuk memulai. Saya pikir metode getHeight () harus cukup.

EDIT:

Jika Anda membutuhkan lebar, itu harus menjadi lebar layar (kan?) Dan itu bisa dikumpulkan seperti ini .

Mat
sumber
2
Strange - getHeight () menghasilkan nol.
Eugene
1
dalam pengembangan saya, saya perhatikan bahwa ia mengembalikan nol di onResume (). Hovever memanggil getActionBar (). GetHeight () ketika Anda benar-benar membutuhkannya mengembalikan nilai positif> 0.
tos
@tos spec untuk getHeight () mengatakan bahwa ia mengembalikan lebar saat ini untuk ActionBar, yang mungkin 0 ketika tampilan dibuat
Nama tampilan
0

Pada Galaxy S4 saya yang memiliki> 441dpi> 1080 x 1920> Mendapatkan tinggi Actionbar dengan getResources (). GetDimensionPixelSize Saya mendapat 144 piksel.

Menggunakan rumus px = dp x (dpi / 160), saya menggunakan 441dpi, sedangkan perangkat saya berada
di kategori 480dpi. jadi menempatkan itu menegaskan hasilnya.

Muhammad
sumber
0

Saya melakukannya dengan cara ini untuk diri saya sendiri, metode pembantu ini harus berguna bagi seseorang:

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;
}
Min2
sumber