206

ActionBar每次创建活动时,我都试图获取(使用 Sherlock)的高度(特别是为了处理 ActionBar 高度可能发生变化的旋转配置更改)。

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

第一次创建第一个活动时,我可以调用回调getHeight()onCreateOptionsMenu但是这个方法之后没有被调用。

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

4

21 回答 21

443

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

// 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)
}
于 2012-11-04T07:14:26.607 回答
156

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

android:paddingTop="?android:attr/actionBarSize"
于 2014-02-17T19:54:37.063 回答
18

好的,我在谷歌上搜索了好几次,所以我认为不仅对 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());
}

预三明治问题

我需要操作栏高度,因为在 ICE_CREAM_SANDWITCH 之前的设备上,我的视图与操作栏重叠。我尝试设置 android:layout_marginTop="?android:attr/actionBarSize", android:layout_marginTop="?attr/actionBarSize",将重叠设置为视图/操作栏,甚至使用自定义主题固定操作栏高度,但没有任何效果。这就是它的样子:

重叠问题

不幸的是,我发现使用上述方法我只能得到一半的高度(我假设选项栏没有到位)所以要完全解决这个问题,我需要将操作栏高度加倍,一切看起来都很好:

重叠固定

如果有人知道更好的解决方案(比将 actionBarHeight 加倍),我会很高兴告诉我,因为我来自 iOS 开发,并且我发现大多数 Android 视图的东西都非常令人困惑 :)

问候,

历史

于 2014-01-05T13:18:40.173 回答
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());
   }
于 2013-03-18T12:23:48.210 回答
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;
}
于 2013-08-25T09:59:12.287 回答
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"
于 2012-09-06T16:01:22.740 回答
6

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

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

然后只需使用工具栏的 layout_height 。

int actionBarHeight = toolbar.getLayoutParams().height;
于 2017-07-21T16:40:54.967 回答
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
于 2014-07-12T22:10:22.947 回答
3

如果您使用的是 Xamarin/C#,这是您要查找的代码:

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
于 2015-04-16T07:08:11.813 回答
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;
}
于 2016-01-18T06:59:43.317 回答
3

满足最受欢迎答案的现成方法:

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;
}
于 2018-07-10T06:08:14.530 回答
3

这是我使用的 Kotlin 的更新版本,假设手机高于 Honeycomb:

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }
于 2019-08-26T17:00:28.717 回答
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();
        }
    }
}
于 2014-06-14T19:01:05.480 回答
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;
    }
于 2015-01-15T18:55:28.830 回答
2

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

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

其中“ mainView ”是布局的根视图。

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

于 2015-04-22T12:16:51.267 回答
2

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

如果你使用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));
    }
于 2016-10-06T09:30:06.407 回答
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;
    }
于 2018-02-20T10:50:39.530 回答
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();
}
于 2016-07-04T04:35:11.470 回答
0

查找操作栏高度的一种简单方法是使用 ActivityonPrepareOptionMenu方法。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }
于 2013-10-26T11:59:59.037 回答
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()
    }
});

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

于 2017-07-26T14:03:58.793 回答
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);
于 2017-08-10T08:47:41.140 回答