Câu trả lời:
Để 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:
@dimen/abc_action_bar_default_height
trự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-land
khi ở chế độ ngang. Nói đến thuộc tính thay vì hoạt động như một nét duyên dáng.
android.R.attr.actionBarSize
sẽ 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 ActionBarCompat
một sẽ dính vào android.support.v7.appcompat.R.attr.actionBarSize
thay thế.
Từ các nguồn được biên dịch lại của Android 3.2 framework-res.apk
, res/values/styles.xml
có 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) ...
Để có được chiều cao thực tế của Actionbar, bạn phải giải quyết thuộc tính actionBarSize
khi chạy.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Một trong những mẫu Honeycomb đề cập đến ?android:attr/actionBarSize
?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.
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.
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
?attr/actionBarSize
nếu một người đang tìm kiếm để phù hợp với một thường xuyên ActionBar
.
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
abs__
tài nguyên -pixixed trực tiếp.
Câu trả lời của @ AZ13 là tốt, nhưng theo hướng dẫn thiết kế Android , ActionBar phải cao ít nhất 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;
}
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 .
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;
}