如何获得ActionBar高度?

zna*_*nat 179 android android-actionbar

ActionBar每次创建一个活动时都试图获得(使用Sherlock)的高度(特别是在ActionBar高度可能改变的情况下处理轮换时的配置更改).

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

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

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

Ant*_*ony 406

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

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

  • 很有帮助!! 但是从哪里找到所有这些东西!! (12认同)
  • 通常是通过详尽的谷歌搜索或通过开发人员手册进行讨论.在这种情况下,我认为后者,但它已经有一段时间了. (5认同)
  • "android.R.attr.actionBarSize"在Android版本2.3中不起作用,但"R.attr.actionBarSize"正在使用android所有版本.只需使用"R.attr.actionBarSize"代替"android.R.attr.actionBarSize","android.support.v7.appcompat.R.attr.actionBarSize"等. (5认同)
  • androidx 的`androidx.appcompat.R.attr.actionBarSize` (2认同)

ces*_*rds 143

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

android:paddingTop="?android:attr/actionBarSize"
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用ActionBarCompat"@ dimen/abc_action_bar_default_height" (20认同)
  • 谢谢Ali AlNoaimi!使用AppCompat v21,名称已更改为:"@ dimen/abc_action_bar_default_height_material" (10认同)
  • 正如下面提到的@muzikant,对于appcompat,如果你想在代码中使用它,正确的属性是`android.support.v7.appcompat.R.attr.actionBarSize`.如果你想在布局xml中使用它,`android:paddingTop ="?attr/actionBarSize"`.到处工作都很好. (5认同)
  • 如果我想使用此attr但为负数,则将其与负填充一起使用。我怎样才能做到这一点? (2认同)

laa*_*ptu 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());
   }
Run Code Online (Sandbox Code Playgroud)


hri*_*.to 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());
}
Run Code Online (Sandbox Code Playgroud)

预Sandwitch问题

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

重叠问题

不幸的是我发现用上面描述的方法我得到的高度只有一半(我认为选项栏没有采取到位)所以要完全修复我需要双倍动作栏高度,一切似乎都可以:

重叠固定

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

问候,

hris.to


and*_*per 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用appcompat,请添加以下内容:`else if(true == getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize,tv,true)){actionBarHeight = TypedValue.complexToDimensionPixelSize( .tv.data,getResources()getDisplayMetrics()); }` (9认同)
  • "if(true =="?我认为你可以删除"true"...... :) (3认同)

bir*_*rdy 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>
Run Code Online (Sandbox Code Playgroud)

并将此设置ThemeActivity:

android:theme="@style/Theme.FixedSize"
Run Code Online (Sandbox Code Playgroud)


Tee*_*ker 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);
Run Code Online (Sandbox Code Playgroud)

xml:

    ?attr/actionBarSize
Run Code Online (Sandbox Code Playgroud)


jk7*_*jk7 5

如果您将工具栏用作ActionBar,

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

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

int actionBarHeight = toolbar.getLayoutParams().height;
Run Code Online (Sandbox Code Playgroud)