ฉันจำเป็นต้องรู้ขนาดที่แน่นอนของ ActionBar ในหน่วยพิกเซลเพื่อใช้ภาพพื้นหลังที่ถูกต้อง
ฉันจำเป็นต้องรู้ขนาดที่แน่นอนของ ActionBar ในหน่วยพิกเซลเพื่อใช้ภาพพื้นหลังที่ถูกต้อง
คำตอบ:
เพื่อดึงความสูงของ ActionBar ใน XML เพียงใช้
?android:attr/actionBarSize
หรือหากคุณเป็นผู้ใช้ ActionBarSherlock หรือ AppCompat ให้ใช้สิ่งนี้
?attr/actionBarSize
หากคุณต้องการค่านี้ตอนใช้งานให้ใช้สิ่งนี้
final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
หากคุณจำเป็นต้องเข้าใจว่าสิ่งนี้ถูกกำหนดไว้ที่ใด:
@dimen/abc_action_bar_default_height
โดยตรง (ActionBarComapt) และใช้งานได้ (บนอุปกรณ์ mdpi) แต่พยายามรับค่านี้ใน Samsung Galaxy SIII คืนค่าผิด นั่นเป็นเพราะvalues-xlarge
(อย่างใด) เป็นที่ต้องการมากกว่าvalues-land
เมื่ออยู่ในโหมดแนวนอน การอ้างถึงคุณสมบัติแทนการทำงานเหมือนเครื่องราง
android.R.attr.actionBarSize
จะแก้ไขเป็น 0 ขนาดบนอุปกรณ์ pre-3.0 ดังนั้นเมื่อใช้ActionBarCompat
อย่างใดอย่างหนึ่งจะติดandroid.support.v7.appcompat.R.attr.actionBarSize
แทน
จากแหล่งที่มาเดอรวบรวมของ Android 3.2 ของframework-res.apk
, res/values/styles.xml
มี:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 และ 3.1 ดูเหมือนจะเหมือนกัน (อย่างน้อยจาก AOSP) ...
เพื่อให้ได้ความสูงที่แท้จริงของ Actionbar คุณต้องแก้ไขแอททริบิวactionBarSize
ตอนรันไทม์
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
หนึ่งในตัวอย่างรังผึ้งหมายถึง ?android:attr/actionBarSize
?attr/actionBarSize
(โปรดสังเกตการขาด android namespace) ซึ่งใช้งานได้กับทุกระดับ API
ฉันจำเป็นต้องทำซ้ำความสูงเหล่านี้อย่างถูกต้องในแอพพลิเคชั่นที่เข้ากันได้ก่อน ICS และขุดลงในแหล่งแกนหลักของเฟรมเวิร์ก คำตอบทั้งสองข้างต้นนั้นถูกต้อง
โดยทั่วไปแล้วจะเดือดลงเมื่อใช้ตัวระบุ ความสูงถูกกำหนดโดยมิติ "action_bar_default_height"
มันถูกกำหนดเป็น 48dip สำหรับการเริ่มต้น แต่สำหรับ - ที่ดินคือ 40dip และสำหรับ sw600dp คือ 56dip
หากคุณกำลังใช้ความเข้ากันได้กับ ActionBar จากแพ็คเกจสนับสนุน v7 appcompat ล่าสุดคุณสามารถรับความสูงได้
@dimen/abc_action_bar_default_height
กับใหม่สนับสนุนห้องสมุด v7 (21.0.0) ชื่อในR.dimen
มีการเปลี่ยนแปลงไป@ dimen / abc_action_bar_default_height_วัสดุ
เมื่ออัพเกรดจาก lib รุ่นก่อนหน้าคุณควรใช้ค่านั้นเป็นความสูงของ actionbar
?attr/actionBarSize
ActionBar
หากคุณใช้ ActionBarSherlock คุณสามารถเพิ่มความสูงได้ด้วย
@dimen/abs__action_bar_default_height
abs__
ทรัพยากรที่ได้รับการแก้ไขโดยตรง
คำตอบของ @ @ AZ13 นั้นดี แต่ตามแนวทางการออกแบบ Androidควรใช้ ActionBarอย่างน้อย 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;
}
สรุปชั้นมักจะเป็นสถานที่ที่ดีที่จะเริ่มต้น ฉันคิดว่าวิธี getHeight () ควรจะพอเพียง
แก้ไข:
หากคุณต้องการความกว้างมันควรจะเป็นความกว้างของหน้าจอ (ขวา) และที่สามารถรวมตัวกันเช่นนี้
ใน Galaxy S4 ของฉันมี> 441dpi> 1080 x 1920> รับความสูงของ Actionbar ด้วย getResources () getDimensionPixelSize ฉันมี 144 พิกเซล
ใช้สูตร px = dp x (dpi / 160) ฉันใช้ 441dpi ในขณะที่อุปกรณ์ของฉันอยู่
ในหมวดหมู่ 480dpi ดังนั้นการวางที่ยืนยันผล
ฉันทำอย่างนี้ด้วยตัวเองวิธีช่วยเหลือนี้ควรมีประโยชน์กับใครบางคน:
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;
}