如何获得ActionBar的高度?
每次创build一个活动(特别是为了处理ActionBar高度可能发生变化的旋转时的configuration更改),我都试图获得ActionBar
的高度(使用Sherlock)。
为此,我使用ActionBar.getHeight()
方法,该方法仅在显示ActionBar
时起作用。
第一次创build第一个活动时,我可以在onCreateOptionsMenu
callback中调用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);