Jawaban:
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:
@dimen/abc_action_bar_default_height
secara 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-land
ketika dalam mode lansekap. Mengacu pada atribut sebagai gantinya bekerja seperti pesona.
android.R.attr.actionBarSize
akan menyelesaikan ke ukuran 0 pada perangkat pra-3.0. Jadi, ketika menggunakan ActionBarCompat
salah satu akan tetap android.support.v7.appcompat.R.attr.actionBarSize
menggunakannya.
Dari sumber Android 3.2 yang tidak dikompilasi framework-res.apk
, res/values/styles.xml
berisi:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 dan 3.1 tampaknya sama (setidaknya dari AOSP) ...
Untuk mendapatkan ketinggian sebenarnya dari Actionbar, Anda harus menyelesaikan atribut actionBarSize
saat runtime.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Salah satu contoh Honeycomb merujuk ?android:attr/actionBarSize
?attr/actionBarSize
(perhatikan kurangnya namespace android) yang bekerja pada semua level API.
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.
Jika Anda menggunakan ActionBar kompatibilitas dari paket dukungan appcompat v7 baru-baru ini, Anda bisa mendapatkan ketinggian menggunakan
@dimen/abc_action_bar_default_height
Dengan pustaka dukungan v7 baru (21.0.0) nama di R.dimen
telah 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
?attr/actionBarSize
jika seseorang mencari yang cocok dengan yang biasa ActionBar
.
Jika Anda menggunakan ActionBarSherlock, Anda bisa mendapatkan ketinggiannya
@dimen/abs__action_bar_default_height
abs__
sumber daya -prefixed secara langsung.
Jawaban @ AZ13 baik, tetapi sesuai dengan pedoman desain Android , ActionBar harus setidaknya 48dp .
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;
}
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 .
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.
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;
}