如何获得ActionBar高度?

时间:2012-09-06 13:45:03

标签: android android-actionbar

每次创建活动时,我都会尝试获取ActionBar(使用Sherlock)的高度(特别是在ActionBar高度可能更改的情况下处理旋转时的配置更改)。

为此,我使用ActionBar.getHeight()方法,该方法仅在显示ActionBar时有效。

首次创建第一个活动时,我可以在getHeight()回调中调用onCreateOptionsMenu。但是此方法不会被调用。

所以我的问题是我什么时候可以调用getHeight()并确保它不会返回0? 或者,如果不可能,我如何设置ActionBar的高度?

21 个答案:

答案 0 :(得分:380)

如果你想明确控制ActionBar大小,@ birdy的答案是一个选项,有一种方法可以在不锁定我在支持文档中找到的大小的情况下提取它。这有点尴尬,但它对我有用。您需要一个上下文,此示例在Activity中有效。

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

答案 1 :(得分:140)

在XML中,您应该使用以下属性:

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

答案 2 :(得分:16)

好的我正在谷歌上搜索并多次访问这篇文章,所以我认为不仅对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”,将重叠设置为视图/操作栏甚至固定操作栏高度与自定义主题但没有任何效果。这就是它的样子:

overlap problem

不幸的是我发现用上面描述的方法我得到的高度只有一半(我假设选项栏没有到位)所以要完全修复我需要的双重操作栏高度,一切似乎都好:

overlap fixed

如果有人知道更好的解决方案(而不是将actionBarHeight加倍),我会很高兴让我知道,因为我来自iOS开发,我发现大多数Android视图的东西都很混乱:)

此致

hris.to

答案 3 :(得分:15)

@Anthony answer适用于支持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());
   }

答案 4 :(得分:12)

我认为最安全的方式是:

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

答案 5 :(得分: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"

答案 6 :(得分:5)

如果您使用工具栏作为ActionBar,

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

然后只使用工具栏的layout_height。

int actionBarHeight = toolbar.getLayoutParams().height;

答案 7 :(得分:4)

爪哇:

    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

答案 8 :(得分: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;
}

答案 9 :(得分: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();
        }
    }
}

答案 10 :(得分: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;
    }

答案 11 :(得分:2)

我找到了一种更通用的方法来发现它:

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

其中' mainView '是您的布局的根视图。

这个想法基本上是 mainView 的Y位置,因为它位于ActionBar(或工具栏)的正下方。

答案 12 :(得分: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;
    }

答案 13 :(得分:2)

操作栏高度根据应用的主题而有所不同。 如果您使用的是 AppCompatActivity ,则大多数情况下的高度与正常活动的高度不同。

如果你正在使用 AppCompatActivity ,你应该使用R.attr.actionBarSize而不是android.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));
    }

答案 14 :(得分:1)

这里是Kotlin的更新版本,我假设手机比Honeycomb高:

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

答案 15 :(得分:1)

一种准备解决最流行答案的方法:

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

答案 16 :(得分: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();
}

答案 17 :(得分:1)

如果你正在使用Xamarin / C#,那么这就是你要找的代码:

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

答案 18 :(得分: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()
    }
});

...并将其更改的最新值更改为。获得高度。

答案 19 :(得分:0)

在尝试了那些没有成功的事情之后,我偶然发现了一个功能性且非常简单的方法来获得操作栏的默认高度。

仅在API 25和24中进行了测试

C#

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

爪哇

getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);

答案 20 :(得分:0)

查找操作栏高度的简单方法来自Activity onPrepareOptionMenu方法。

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