Kích thước của ActionBar tính bằng pixel là bao nhiêu?


Câu trả lời:


558

Để lấy lại chiều cao của ActionBar trong XML, chỉ cần sử dụng

?android:attr/actionBarSize

hoặc nếu bạn là người dùng ActionBarSherlock hoặc AppCompat, hãy sử dụng cái này

?attr/actionBarSize

Nếu bạn cần giá trị này trong thời gian chạy, sử dụng

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

Nếu bạn cần hiểu nơi này được xác định:

  1. Tên thuộc tính được định nghĩa trong /res/values/attrs.xml của nền tảng
  2. Themes.xml của nền tảng chọn thuộc tính này và gán một giá trị cho nó.
  3. Giá trị được chỉ định trong bước 2 phụ thuộc vào các kích thước thiết bị khác nhau, được xác định trong các tệp dimens.xml khác nhau trong nền tảng, nghĩa là. core / res / res / value-sw600dp / dimens.xml

7
Câu trả lời chính xác. Tôi biết cách khai thác thông tin này, nhưng để tìm kiếm câu trả lời này nhanh hơn +1. Câu trả lời của bạn cũng là một gợi ý tuyệt vời làm thế nào để tìm kiếm những thứ như vậy.
thiệu

1
Cảm ơn bạn. Tôi đã cố gắng sử dụng @dimen/abc_action_bar_default_heighttrực tiếp (ActionBarComapt) và nó đã hoạt động (trên thiết bị mdpi). Nhưng cố gắng để có được giá trị này trên Samsung Galaxy SIII đã trả lại cho tôi giá trị sai. Đó là bởi vì values-xlarge(bằng cách nào đó) được ưa thích hơn so với values-landkhi ở chế độ ngang. Nói đến thuộc tính thay vì hoạt động như một nét duyên dáng.
Alex Semeniuk

4
@ AZ13 Tôi muốn thêm android.R.attr.actionBarSizesẽ giải quyết kích thước 0 trên các thiết bị trước 3.0. Vì vậy, khi sử dụng ActionBarCompatmột sẽ dính vào android.support.v7.appcompat.R.attr.actionBarSizethay thế.
vẽ

1
Anh chàng hỏi nó bằng pixel. Tôi cho rằng actionBarSize trả về giá trị dp. Tôi nhận được giá trị 48dp. Điều đó có nghĩa là chuyển đổi nó thành pixel mang lại cho tôi 96 pixel cho xhdpi.
Muhammad

"Android.R.attr.actionBarSize" không hoạt động trong phiên bản Android 2.3, nhưng "R.attr.actionBarSize" đang hoạt động trên Android tất cả các phiên bản. chỉ sử dụng "R.attr.actionBarSize" thay vì "android.R.attr.actionBarSize" và v.v.
Nathaniel Jobs

59

Từ các nguồn được biên dịch lại của Android 3.2 framework-res.apk, res/values/styles.xmlcó chứa:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0 và 3.1 dường như giống nhau (ít nhất là từ AOSP) ...


1
Điều gì về chiều cao khác nhau của thanh hành động trong phong cảnh?
Manfred Moser

86
trên 4.0+: mặc định là 48dp, phong cảnh là 40dp, sw600dp là 56dp
Jake Wharton

19
Đó là lý do tại sao bạn nên sử dụng giá trị android: attr chứ không phải giá trị mã hóa cứng!
Vikram Bod Richla

45

Để có được chiều cao thực tế của Actionbar, bạn phải giải quyết thuộc tính actionBarSizekhi chạy.

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

33

Một trong những mẫu Honeycomb đề cập đến ?android:attr/actionBarSize


3
Có, được giải thích tại đây: developer.android.com/guide/topics/ui/ từ
Con trỏ Null

3
Đây là câu trả lời nếu sdk tối thiểu của bạn là> = 11, nếu bạn tối thiểu <11, thì rất có thể bạn đang sử dụng ABS, thì đây là giải pháp: @ dimen / abs__action_bar_default_height
Adam

9
ABS có ?attr/actionBarSize(lưu ý thiếu không gian tên Android) hoạt động trên tất cả các cấp API.
Jake Wharton

21

Tôi cần phải sao chép chính xác các độ cao này trong một ứng dụng tương thích trước ICS và đào sâu vào nguồn lõi khung . Cả hai câu trả lời ở trên đều đúng.

Về cơ bản, nó sôi sục để sử dụng vòng loại. Chiều cao được xác định bởi thứ nguyên "action_bar_default_height"

Nó được định nghĩa là 48dip cho mặc định. Nhưng đối với -land thì nó là 40dip và đối với sw600dp là 56dip.


17

Nếu bạn đang sử dụng ActionBar tương thích từ gói hỗ trợ ứng dụng v7 gần đây, bạn có thể lấy chiều cao bằng cách sử dụng

@dimen/abc_action_bar_default_height

Tài liệu


16

Với thư viện hỗ trợ v7 mới (21.0.0), tên trong R.dimenđã thay đổi thành tài liệu @ dimen / abc_action_bar_default_height_ .

Khi nâng cấp từ phiên bản trước của lib hỗ trợ, do đó bạn nên sử dụng giá trị đó làm chiều cao của thanh hành động


1
Hoàn hảo! Điều này chắc chắn nhịp đập ?attr/actionBarSizenếu một người đang tìm kiếm để phù hợp với một thường xuyên ActionBar.
karllindmark

9

Nếu bạn đang sử dụng ActionBarSherlock, bạn có thể lấy chiều cao bằng

@dimen/abs__action_bar_default_height

Không sử dụng abs__tài nguyên -pixixed trực tiếp.
Jake Wharton

2
@JakeWharton xin vui lòng cho chúng tôi biết làm thế nào để làm điều đó một cách chính xác, sau đó.
JesperB

Tạo thứ nguyên của riêng bạn để bạn không phụ thuộc vào abs_.
Được sửa đổi vào


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

Các Tóm tắt Lớp thường là một nơi tốt để bắt đầu. Tôi nghĩ rằng phương thức getHeight () là đủ.

BIÊN TẬP:

Nếu bạn cần chiều rộng, nó phải là chiều rộng của màn hình (phải không?) Và có thể được thu thập như thế này .


2
Strange - getHeight () cho kết quả bằng không.
Eugene

1
trong quá trình phát triển của mình, tôi nhận thấy rằng nó trả về 0 trong onResume (). Hovever gọi getActionBar (). GetHeight () khi bạn thực sự cần nó trả về giá trị dương> 0.
tos

@tos thông số kỹ thuật cho getHeight () nói rằng nó trả về chiều rộng hiện tại cho ActionBar, có thể là 0 khi chế độ xem được tạo
Tên hiển thị

0

Trên Galaxy S4 của tôi có> 441dpi> 1080 x 1920> Lấy chiều cao của Actionbar bằng getResource (). GetDimensionPixelSize Tôi có 144 pixel.

Sử dụng công thức px = dp x (dpi / 160), tôi đã sử dụng 441dpi, trong khi thiết bị của tôi nằm
trong danh mục 480dpi. để đặt mà xác nhận kết quả.


0

Tôi đã làm theo cách này cho bản thân mình, phương pháp trợ giúp này sẽ có ích cho ai đó:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.