답변:
XML에서 ActionBar의 높이를 검색하려면 다음을 사용하십시오.
?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
3.0 이전 장치에서는 0 크기로 확인 되는 추가하고 싶습니다 . 따라서 ActionBarCompat
하나 를 사용할 때 android.support.v7.appcompat.R.attr.actionBarSize
대신 붙어 있습니다.
안드로이드 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에서) ...
허니컴 샘플 중 하나는 ?android:attr/actionBarSize
?attr/actionBarSize
모든 API 수준에서 작동하는 (Android 네임 스페이스가 없음을 유의하십시오).
사전 ICS 호환성 앱에서 이러한 높이를 올바르게 복제하고 프레임 워크 코어 소스를 파헤쳐 야했습니다 . 위의 두 대답은 정확합니다.
기본적으로 한정자를 사용하는 것으로 요약됩니다. 높이는 "action_bar_default_height"차원으로 정의됩니다.
기본적으로 48dip로 정의되어 있습니다. 그러나 -land의 경우 40dip이고 sw600dp의 경우 56dip입니다.
최신 v7 appcompat 지원 패키지의 호환성 ActionBar를 사용하는 경우 다음을 사용하여 높이를 얻을 수 있습니다.
@dimen/abc_action_bar_default_height
새로운 v7 지원 라이브러리 (21.0.0)에서 이름 R.dimen
이 @ dimen / abc_action_bar_default_height_ material로 변경되었습니다 .
이전 버전의 지원 라이브러리에서 업그레이드 할 때 해당 값을 조치 막대의 높이로 사용해야합니다.
?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 () 메소드로 충분하다고 생각합니다.
편집하다:
너비가 필요한 경우 화면 너비 (오른쪽?) 여야하며 다음 과 같이 수집 할 수 있습니다 .
나는이 방법으로 나 자신을 위해했다.이 도우미 방법은 누군가에게 유용해야합니다.
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;
}