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.