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

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


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


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.


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



9

Jika Anda menggunakan ActionBarSherlock, Anda bisa mendapatkan ketinggiannya

@dimen/abs__action_bar_default_height

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

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 .


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.


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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.