ActionBar ขนาดเท่าพิกเซลคืออะไร?


คำตอบ:


558

เพื่อดึงความสูงของ 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();

หากคุณจำเป็นต้องเข้าใจว่าสิ่งนี้ถูกกำหนดไว้ที่ใด:

  1. ชื่อแอ็ตทริบิวต์นั้นถูกกำหนดใน/res/values/attrs.xmlของแพลตฟอร์ม
  2. themes.xmlของแพลตฟอร์มเลือกแอตทริบิวต์นี้และกำหนดค่าให้กับมัน
  3. ค่าที่กำหนดในขั้นตอนที่ 2 ขึ้นอยู่กับขนาดของอุปกรณ์ต่าง ๆ ซึ่งกำหนดไว้ในไฟล์ dimens.xml ต่างๆในแพลตฟอร์มเช่น core / ละเอียด / ความละเอียด / ค่า-sw600dp / dimens.xml

7
คำตอบที่ดี ฉันรู้วิธีขุดข้อมูลนี้ แต่การค้นหาคำตอบนี้เร็วกว่า +1 มาก คำตอบของคุณคือคำแนะนำที่ดีในการค้นหาสิ่งต่าง ๆ
rekire

1
ขอบคุณ. ฉันพยายามใช้@dimen/abc_action_bar_default_heightโดยตรง (ActionBarComapt) และใช้งานได้ (บนอุปกรณ์ mdpi) แต่พยายามรับค่านี้ใน Samsung Galaxy SIII คืนค่าผิด นั่นเป็นเพราะvalues-xlarge(อย่างใด) เป็นที่ต้องการมากกว่าvalues-landเมื่ออยู่ในโหมดแนวนอน การอ้างถึงคุณสมบัติแทนการทำงานเหมือนเครื่องราง
Alex Semeniuk

4
@ AZ13 ฉันต้องการเพิ่มที่android.R.attr.actionBarSizeจะแก้ไขเป็น 0 ขนาดบนอุปกรณ์ pre-3.0 ดังนั้นเมื่อใช้ActionBarCompatอย่างใดอย่างหนึ่งจะติดandroid.support.v7.appcompat.R.attr.actionBarSizeแทน
Drew

1
ชายคนนั้นถามเป็นพิกเซล ฉันคิดว่า actionBarSize จะส่งกลับค่า dp ฉันได้ค่า 48dp นั่นหมายถึงการแปลงเป็นพิกเซลให้ฉัน 96 พิกเซลสำหรับ xhdpi
มูฮัมหมัด

"android.R.attr.actionBarSize" ไม่ทำงานใน android เวอร์ชั่น 2.3 แต่ "R.attr.actionBarSize" ทำงานได้กับ android ทุกรุ่น เพียงแค่ใช้ "R.attr.actionBarSize" แทน "android.R.attr.actionBarSize" และอื่น ๆ
งานนาธาเนียล

59

จากแหล่งที่มาเดอรวบรวมของ 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) ...


1
สิ่งที่เกี่ยวกับความสูงที่แตกต่างกันของแถบการกระทำในแนวนอน?
Manfred Moser

86
ใน 4.0+: ค่าเริ่มต้นคือ 48dp, แนวนอนคือ 40dp, sw600dp คือ 56dp
Jake Wharton

19
นี่คือเหตุผลที่คุณควรใช้ Android: ค่า attr ไม่ใช่ค่าฮาร์ดโค้ด!
Vikram Bodicherla

45

เพื่อให้ได้ความสูงที่แท้จริงของ Actionbar คุณต้องแก้ไขแอททริบิวactionBarSizeตอนรันไทม์

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

33

หนึ่งในตัวอย่างรังผึ้งหมายถึง ?android:attr/actionBarSize


3
ใช่ได้อธิบายไว้ที่นี่: developer.android.com/guide/topics/ui/…
Pointer Null

3
นี่คือคำตอบหาก min sdk ของคุณคือ> = 11 หากคุณมีค่าต่ำกว่า <11 น่าจะเป็นเพราะคุณใช้ ABS นี่เป็นวิธีแก้ปัญหา: @ dimen / abs__action_bar_default_height
Adam

9
ABS มี?attr/actionBarSize(โปรดสังเกตการขาด android namespace) ซึ่งใช้งานได้กับทุกระดับ API
Jake Wharton

21

ฉันจำเป็นต้องทำซ้ำความสูงเหล่านี้อย่างถูกต้องในแอพพลิเคชั่นที่เข้ากันได้ก่อน ICS และขุดลงในแหล่งแกนหลักของเฟรมเวิร์ก คำตอบทั้งสองข้างต้นนั้นถูกต้อง

โดยทั่วไปแล้วจะเดือดลงเมื่อใช้ตัวระบุ ความสูงถูกกำหนดโดยมิติ "action_bar_default_height"

มันถูกกำหนดเป็น 48dip สำหรับการเริ่มต้น แต่สำหรับ - ที่ดินคือ 40dip และสำหรับ sw600dp คือ 56dip


17

หากคุณกำลังใช้ความเข้ากันได้กับ ActionBar จากแพ็คเกจสนับสนุน v7 appcompat ล่าสุดคุณสามารถรับความสูงได้

@dimen/abc_action_bar_default_height

เอกสาร


16

กับใหม่สนับสนุนห้องสมุด v7 (21.0.0) ชื่อในR.dimenมีการเปลี่ยนแปลงไป@ dimen / abc_action_bar_default_height_วัสดุ

เมื่ออัพเกรดจาก lib รุ่นก่อนหน้าคุณควรใช้ค่านั้นเป็นความสูงของ actionbar


1
ที่สมบูรณ์แบบ! นี้แน่ใจว่าเต้นถ้าจะมองหาเพื่อให้ตรงกับปกติ?attr/actionBarSize ActionBar
karllindmark

9

หากคุณใช้ ActionBarSherlock คุณสามารถเพิ่มความสูงได้ด้วย

@dimen/abs__action_bar_default_height

อย่าใช้abs__ทรัพยากรที่ได้รับการแก้ไขโดยตรง
Jake Wharton

2
@ JakeWharton โปรดบอกให้เราทราบวิธีการทำอย่างถูกต้องแทนแล้ว
JesperB

สร้างมิติของคุณเองเพื่อที่คุณจะไม่ได้พึ่งพา 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

สรุปชั้นมักจะเป็นสถานที่ที่ดีที่จะเริ่มต้น ฉันคิดว่าวิธี getHeight () ควรจะพอเพียง

แก้ไข:

หากคุณต้องการความกว้างมันควรจะเป็นความกว้างของหน้าจอ (ขวา) และที่สามารถรวมตัวกันเช่นนี้


2
Strange - getHeight () ให้ผลลัพธ์เป็นศูนย์
ยูจีน

1
ในการพัฒนาของฉันฉันสังเกตเห็นว่ามันกลับเป็นศูนย์ใน onResume () Hovever เรียกใช้ getActionBar (). getHeight () เมื่อคุณต้องการให้มันคืนค่าบวก> 0
การชำระเงิน

@tos ข้อมูลจำเพาะสำหรับ getHeight () บอกว่าคืนค่าความกว้างปัจจุบันของ ActionBar ซึ่งอาจเป็น 0 เมื่อสร้างมุมมอง
ชื่อที่แสดง

0

ใน Galaxy S4 ของฉันมี> 441dpi> 1080 x 1920> รับความสูงของ Actionbar ด้วย getResources () getDimensionPixelSize ฉันมี 144 พิกเซล

ใช้สูตร px = dp x (dpi / 160) ฉันใช้ 441dpi ในขณะที่อุปกรณ์ของฉันอยู่
ในหมวดหมู่ 480dpi ดังนั้นการวางที่ยืนยันผล


0

ฉันทำอย่างนี้ด้วยตัวเองวิธีช่วยเหลือนี้ควรมีประโยชน์กับใครบางคน:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.