如何获得ActionBar的高度?

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

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

第一次创build第一个活动时,我可以在onCreateOptionsMenucallback中调用getHeight() 。 但是这个方法不会被调用。

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

虽然@ birdy的答案是一个选项,如果你想明确地控制ActionBar的大小有一个方法来拉起来,而不是locking我在支持文档中find的大小。 这有点尴尬,但这对我来说是有效的。 你需要一个上下文,这个例子在一个Activity中是有效的。

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

在XML中,你应该使用这个属性:

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

@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()); } 

好的,我在Google上search了几次,所以我认为不仅可以用来描述Sherlock,还可以用来描述appcompat:

使用appCompat的动作栏高度

非常类似于@Anthony描述你可以find它与下面的代码(我刚刚改变了资源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”,设置重叠closures查看/操作栏,甚至固定的自定义主题的操作栏高度,但没有任何工作。 这就是它的样子:

重叠问题

不幸的是,我发现用上面描述的方法,我得到只有一半的高度(我认为选项栏没有采取适当的位置),所以要完全解决这个问题,我需要双重行动栏高度,一切似乎确定:

重叠固定

如果有人知道更好的解决scheme(比双倍actionBarHeight),我会很高兴让我知道,因为我来自iOS开发,我发现大部分的Android视图的东西很混乱:)

问候,

hris.to

我认为最安全的方法是:

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

要设置ActionBar的高度,你可以创build一个像这样的新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" 

Java的:

  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 

你可以使用这个函数来获取操作栏的高度。

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

这个帮手的方法应该派上用场。 例如: 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(); } } } 

你只需要添加这个。

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

动作栏高度根据所应用的主题而不同。 如果您使用的是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)); } 

如果你使用Xamarin / C#,这是你正在寻找的代码:

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

我发现了一个更通用的方法来发现它:

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

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

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

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

查找操作栏高度的简单方法是从Activity onPrepareOptionMenu方法。

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

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

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

那么只需使用工具栏的layout_height。

 int actionBarHeight = toolbar.getLayoutParams().height; 

在javafx(使用胶子),高度是在运行时设置或类似的东西。 虽然能够像正常一样获得宽度…

double width = appBar.getWidth();

你必须创build一个监听器:

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

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

在尝试了所有没有成功的东西之后,我偶然发现了一个function非常简单的方法来获取操作栏的默认高度。

只在API 25和24中进行testing

C#

 Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

Java的

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