Answers:
如果您想显式控制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)
}
在XML中,应使用以下属性:
android:paddingTop="?android:attr/actionBarSize"
android.support.v7.appcompat.R.attr.actionBarSize
。如果要在布局xml中使用它,请参见android:paddingTop="?attr/actionBarSize"
。在任何地方都可以正常工作。
好吧,我在谷歌上搜索了几次,所以我认为不仅对Sherlock进行描述,对于appcompatpat也将是很好的描述:
使用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视图的内容都令人困惑:)
问候,
hris.to
ActionBar.getHeight()
。根据情况,这也可能适合您。
layout_gravity="center_vertical"
?将其更改为"bottom"
。Android 2.3在FrameLaoyut中处理利润的方式与更新的android不同。
@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());
}
com.actionbarsherlock.R.attr.actionBarSize
在Android 2.3和4.0上都工作过,因此无论Android版本如何,您都可以使用它。
我认为最安全的方法是:
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;
}
else if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }
要设置高度,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"
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
这种帮助方法应该对某人有用。例: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();
}
}
}
我发现了一种更通用的发现方式:
int[] location = new int[2];
mainView.getLocationOnScreen(location);
int toolbarHeight = location[1];
其中“ mainView ”是布局的根视图。
这个想法基本上是获得mainView的Y位置,因为它位于ActionBar(或Toolbar)的正下方。
动作栏的高度根据所应用的主题而不同。如果您使用的是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));
}
在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;
}
一种可以满足最受欢迎答案的现成方法:
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;
}
这是Kotlin的更新版本,我假设手机比Honeycomb高:
val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
}
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());
.....
}
在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()
}
});
...并采用它更改为的最新值。得到高度。
在尝试一切成功之后,我偶然发现了一种实用且非常简单的方法来获取操作栏的默认高度。
仅在API 25和24中测试
C#
Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material);
爪哇
getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);