ActionBar 높이를 얻는 방법?


190

ActionBar활동이 생성 될 때마다 (특히 ActionBar 높이가 변경 될 수있는 회전의 구성 변경을 처리하기 위해) (Sherlock 사용) 의 높이를 얻으려고합니다 .

이를 위해 나는 표시 ActionBar.getHeight()될 때만 작동 하는 방법 을 사용합니다 ActionBar.

첫 번째 활동이 처음 생성 getHeight()되면 onCreateOptionsMenu콜백 에서 전화를 걸 수 있습니다 . 그러나이 메소드는 호출되지 않습니다.

그래서 내 질문은 언제 getHeight ()를 호출 할 수 있고 0을 반환하지 않는 것이 확실합니까? 또는 가능하지 않은 경우 ActionBar의 높이를 어떻게 설정할 수 있습니까?

답변:


419

@Bary의 답변은 ActionBar 크기를 명시 적으로 제어하려는 경우 옵션이지만 지원 문서에서 찾은 크기를 잠그지 않고 끌어 올릴 수있는 방법이 있습니다. 조금 어색하지만 그것은 나를 위해 일했습니다. 컨텍스트가 필요합니다.이 예제는 활동에서 유효합니다.

// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
    Int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

코 틀린 :

val tv = TypedValue()
if (requireActivity().theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
    val actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
}

13
큰 도움이 !! 그러나 당신이 그런 모든 것을 발견하는 곳에서!
vikky

5
일반적으로 개발자 핸드북을 통해 철저한 인터넷 검색 또는 멍청이에서. 나는이 경우 후자를 생각하지만 오래되었습니다.
Anthony

1
특정 활동에 대해서만 작업 표시 줄 크기를 변경할 수 있습니까?
Sudarshan Bhat

이것은 두 경우 모두 나를 위해 일했습니다 : (i) onCreateView 및 (ii) onConfigurationChanged. 감사!
Marcelo Noguti

5
"android.R.attr.actionBarSize"는 Android 버전 2.3에서 작동하지 않지만 "R.attr.actionBarSize"는 Android 모든 버전에서 작동합니다. "android.R.attr.actionBarSize", "android.support.v7.appcompat.R.attr.actionBarSize"등 대신 "R.attr.actionBarSize"를 사용하십시오.
Nathaniel Jobs

148

XML에서는이 속성을 사용해야합니다.

android:paddingTop="?android:attr/actionBarSize"

20
경우에 당신은 "@ DIMEN / abc_action_bar_default_height"ActionBarCompat 사용
알리 AlNoaimi

10
감사합니다 Ali AlNoaimi! AppCompat v21에서는 이름이 "@ dimen / abc_action_bar_default_height_material"으로 변경되었습니다
Tony Ceralva

5
아래에 언급 된 @ muzikant와 같이 appcompat의 경우 코드에서 사용하려면 올바른 속성은 android.support.v7.appcompat.R.attr.actionBarSize입니다. 레이아웃 xml에서 사용하려면 android:paddingTop="?attr/actionBarSize". 어디서나 잘 작동합니다.
rpattabi

1
이 솔루션은 커스텀 XML 프레임 레이아웃을 사용할 때 훌륭합니다.
tryp

2
이 attr을 사용하고 싶지만 네거티브 패딩과 함께 사용하려면 음수입니다. 어떻게해야합니까?
Tiger 개발자

17

좋아, 나는 인터넷 검색을 하고이 게시물에 여러 번 도착했기 때문에 Sherlock뿐만 아니라 appcompat에 대해서도 설명하는 것이 좋을 것이라고 생각합니다.

appCompat를 사용한 액션 바 높이

@Anthony 설명과 매우 유사하지만 다음 코드로 찾을 수 있습니다 (방금 리소스 ID를 변경했습니다).

TypedValue tv = new TypedValue();

if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
    int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

사전 Sandwitch 문제

ICE_CREAM_SANDWITCH 이전 장치에서 뷰가 작업 표시 줄과 겹치므로 작업 표시 줄 높이가 필요했습니다. android : layout_marginTop = "? android : attr / actionBarSize", android : layout_marginTop = "? attr / actionBarSize"설정을 시도했지만보기 / 작업 표시 줄에 겹침을 설정하고 사용자 정의 테마로 고정 작업 표시 줄 높이를 설정했지만 아무 것도 작동하지 않았습니다. 그 모습은 다음과 같습니다.

중복 문제

불행히도 위에서 설명한 방법으로 높이의 절반 만 얻을 수 있다는 것을 알았습니다 (옵션 막대가 제 위치에 있지 않다고 가정합니다). 문제를 완전히 해결하려면 작업 막대 높이 를 두 배로 늘려야 하며 모든 것이 정상으로 보입니다.

오버랩 고정

누군가가 더 나은 솔루션을 알고 있다면 (actionBarHeight를 두 배로 늘리는 것보다) iOS 개발에서 나에게 알려 드리겠습니다. 안드로이드보기의 물건 대부분이 꽤 혼란 스럽다는 것을 알았습니다. :)

문안 인사,

hris.to


탭을 사용할 때도 같은 경험이있었습니다. 문제는 일부 장치가 시각적으로 탭을 기본 ActionBar로 시각적으로 축소하기 때문에 탭이없는 탭을 감지하기가 어렵다는 것입니다. 그래서 나를 위해 일한 것은 단지 ActionBar.getHeight()입니다. 상황에 따라 효과가있을 수도 있습니다.
TalkLittle

나는 행동 막대의 높이 만 고려하고있는 문제 cuz에 직면하고 있었고, '알림 바'의 높이도 추가했습니다. 그것은 나를 위해 잘 작동했습니다.
Darpan

FrameLayout을 사용하고 layout_gravity="center_vertical"있습니까? 로 변경하십시오 "bottom". Android 2.3은 FrameLaoyut의 마진을 최신 Android와 다르게 처리합니다.
Oliv

16

@Anthony 답변은 지원 ActionBar되는 장치 및 Sherlock Action Bar다음 방법 만 지원하는 장치에서 사용해야합니다.

    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());

    if(actionBarHeight ==0 && getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }

   //OR as stated by @Marina.Eariel
   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 if(getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true){
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
   }

이전 Android 버전에서 런타임 오류를 피하기 위해 "if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB) {}"인 경우 첫 번째 랩핑 할 수 있습니다.
Marina.Eariel

나를 com.actionbarsherlock.R.attr.actionBarSize위해 Android 2.3 및 4.0 모두에서 일했기 때문에 Android 버전에 관계없이 이것을 사용할 수있는 것처럼 보입니다.
Felix

13

가장 안전한 방법은 다음과 같습니다.

private int getActionBarHeight() {
    int actionBarHeight = getSupportActionBar().getHeight();
    if (actionBarHeight != 0)
        return actionBarHeight;
    final 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 if (getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
    return actionBarHeight;
}

9
appcompat를 사용하는 경우 다음을 추가하십시오.else if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }
Muzikant

3
"if (true =="? "true"를 제거 할 수 있다고 생각합니다 ... :)
Android 개발자

네 맞아요. 명확성을 위해 추가되었습니다.
Muzikant

코드에서 ABS를 사용하는 경우 중요하지 않은 것처럼 보입니다 .HONEYCOMB 위의 모든 버전에서는 android.R.attr.actionBarSize에서 작업 표시 줄 높이를 가져옵니다. 이 올바른지 ?
AsafK

어쨌든 화면 상단을 숨기도록 반 작업 표시 줄을 지정합니까? stackoverflow.com/questions/27163374/…
Steve

6

높이를 설정하려면 다음 과 같이 ActionBar새로 만들 수 있습니다 Theme.

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    <style name="Theme.FixedSize" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="actionBarSize">48dip</item>
        <item name="android:actionBarSize">48dip</item> 
    </style> 
 </resources>

그리고 이것을 Theme당신의 것으로 설정 하십시오 Activity:

android:theme="@style/Theme.FixedSize"

1
가로 모드에서는 작업 표시 줄의 높이가 더 작습니다.
Mark Buikema

actionBarSherlock은 작업 표시 줄 높이를 결정할 때 많은 것을 고려하기 때문에 이것을 권장하지 않습니다. 이 작업을 수행하면 actionBar 높이는 장치 사양을 기반으로하지 않으므로 특정 장치의 표준 높이처럼 보이지 않습니다.
Chris Sprague 2012 년

5

자바:

    int actionBarHeight;
    int[] abSzAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        abSzAttr = new int[] { android.R.attr.actionBarSize };
    } else {
        abSzAttr = new int[] { R.attr.actionBarSize };
    }
    TypedArray a = obtainStyledAttributes(abSzAttr);
    actionBarHeight = a.getDimensionPixelSize(0, -1);

xml :

    ?attr/actionBarSize

5

툴바를 ActionBar로 사용하는 경우

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

그런 다음 툴바의 layout_height를 사용하십시오.

int actionBarHeight = toolbar.getLayoutParams().height;

3

이 기능을 사용하여 작업 표시 줄의 높이를 얻을 수 있습니다.

public int getActionBarHeight() {
    final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
            new int[] {android.R.attr.actionBarSize});
    int actionBarHeight = (int) ta.getDimension(0, 0);
    return actionBarHeight;
}

2

이 도우미 방법은 누군가에게 유용해야합니다. 예:int actionBarSize = getThemeAttributeDimensionSize(this, android.R.attr.actionBarSize);

public static int getThemeAttributeDimensionSize(Context context, int attr)
{
    TypedArray a = null;
    try{
        a = context.getTheme().obtainStyledAttributes(new int[] { attr });
        return a.getDimensionPixelSize(0, 0);
    }finally{
        if(a != null){
            a.recycle();
        }
    }
}

2

이것을 추가하면됩니다.

public int getActionBarHeight() {
        int height;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            height = getActivity().getActionBar().getHeight();
        } else {
            height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();

        }
        return height;
    }

2

나는 그것을 발견하는보다 일반적인 방법을 찾았습니다.

  int[] location = new int[2];
  mainView.getLocationOnScreen(location);
  int toolbarHeight = location[1];

여기서 ' mainView '는 레이아웃의 루트보기입니다.

아이디어는 기본적으로 ActionView (또는 툴바) 바로 아래에 설정된 mainView 의 Y 위치를 얻습니다 .


2

작업 표시 줄 높이는 적용된 테마에 따라 다릅니다. AppCompatActivity를 사용 하는 경우 대부분의 경우 높이가 일반 활동과 다릅니다.

AppCompatActivity 를 사용하는 경우 android.R.attr.actionBarSize 대신 R.attr.actionBarSize를 사용해야합니다.

public static int getActionBarHeight(Activity activity) {
        TypedValue typedValue = new TypedValue();

        int attributeResourceId = android.R.attr.actionBarSize;
        if (activity instanceof AppCompatActivity) {
            attributeResourceId = R.attr.actionBarSize;
        }

        if (activity.getTheme().resolveAttribute(attributeResourceId, typedValue, true)) {
            return TypedValue.complexToDimensionPixelSize(typedValue.data, activity.getResources().getDisplayMetrics());
        }

        return (int) Math.floor(activity.getResources()
                .getDimension(R.dimen.my_default_value));
    }

2

xml에서는? attr / actionBarSize를 사용할 수 있지만 Java에서 해당 값에 액세스해야하는 경우 아래 코드를 사용해야합니다.

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;
    }

2

가장 인기있는 답변을 수행 할 수있는 준비된 방법 :

public static int getActionBarHeight(
  Activity activity) {

  int actionBarHeight = 0;
  TypedValue typedValue = new TypedValue();

  try {

    if (activity
      .getTheme()
      .resolveAttribute(
        android.R.attr.actionBarSize,
        typedValue,
        true)) {

      actionBarHeight =
        TypedValue.complexToDimensionPixelSize(
          typedValue.data,
          activity
            .getResources()
            .getDisplayMetrics());
    }

  } catch (Exception ignore) {
  }

  return actionBarHeight;
}

2

전화가 Honeycomb보다 높다고 가정 한 Kotlin에서 업데이트 된 버전은 다음과 같습니다.

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }

1

Xamarin / C #을 사용하는 경우 원하는 코드입니다.

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();

1
The action bar now enhanced to app bar.So you have to add conditional check for getting height of action bar.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   height = getActivity().getActionBar().getHeight();
 } else {
  height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();
}

0

작업 표시 줄 높이를 찾는 간단한 방법은 활동 onPrepareOptionMenu방법입니다.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }

0

javafx (Gluon 사용)에서 높이는 런타임 또는 이와 비슷한 것으로 설정됩니다. 일반처럼 너비를 얻을 수 있지만 ...

double width = appBar.getWidth();

리스너를 작성해야합니다.

GluonApplication application = this;

application.getAppBar().heightProperty().addListener(new ChangeListener(){
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
        // Take most recent value given here
        application.getAppBar.heightProperty.get()
    }
});

... 그리고 가장 최근에 변경된 값을 취하십시오. 높이를 얻으려면.


0

성공없이 거기에있는 모든 것을 시도한 후에, 우연히, 액션 바의 기본 높이를 얻는 기능적이고 매우 쉬운 방법을 발견했습니다.

API 25 및 24에서만 테스트

씨#

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

자바

getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.