Как получить высоту ActionBar?
Я пытаюсь получить высоту ActionBar
(используя Шерлок) каждый раз, когда создается действие (специально для обработки изменений конфигурации при повороте, где высота ActionBar может измениться).
Для этого я использую метод ActionBar.getHeight()
, который работает только тогда, когда отображается ActionBar
.
Когда первое действие создается впервые, я могу вызвать getHeight()
в обратном вызове onCreateOptionsMenu
. Но этот метод не вызывается после.
Итак, мой вопрос: когда я могу вызвать getHeight() и быть уверенным, что он не вернет 0?
Или, если это невозможно, как я могу установить высоту ActionBar?
Ответы
Ответ 1
Хотя @birdy answer - это вариант, если вы хотите явно контролировать размер 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());
}
Ответ 2
В XML вы должны использовать этот атрибут:
android:paddingTop="?android:attr/actionBarSize"
Ответ 3
Хорошо, я много раз заходил в эту должность и добирался до этого поста, поэтому считаю, что будет хорошо описываться не только для Шерлока, но и для appcompat:
Высота панели действий с помощью appCompat
Довольно похожий на описание @Anthony, вы можете найти его со следующим кодом (я только что изменил идентификатор ресурса):
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", установив перекрытие для просмотра/панели действий и даже фиксированную высоту панели действий с пользовательской темой, но ничего не получилось. Вот как это выглядело:
![overlap problem]()
К сожалению, я узнал, что с описанным выше методом я получаю только половину высоты (я предполагаю, что панель параметров не установлена), чтобы полностью исправить значение, которое мне нужно, чтобы двойная панель действий высота и все выглядит нормально:
![overlap fixed]()
Если кто-то знает лучшее решение (чем удваивает actionBarHeight), я буду рад сообщить мне, что я пришел из разработки iOS, и я обнаружил, что большинство элементов Android выглядят довольно запутанными:)
Привет,
hris.to
Ответ 4
Ответ @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());
}
Ответ 5
Я думаю, что самый безопасный способ:
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;
}
Ответ 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"
Ответ 7
Если вы используете панель инструментов в качестве ActionBar,
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
то просто используйте layout_height на панели инструментов.
int actionBarHeight = toolbar.getLayoutParams().height;
Ответ 8
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
Ответ 9
эту функцию можно использовать для получения высоты панели действий.
public int getActionBarHeight() {
final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
new int[] {android.R.attr.actionBarSize});
int actionBarHeight = (int) ta.getDimension(0, 0);
return actionBarHeight;
}
Ответ 10
Этот вспомогательный метод может пригодиться кому-то. Пример: 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();
}
}
}
Ответ 11
вам просто нужно добавить это.
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;
}
Ответ 12
Я нашел более общий способ его обнаружить:
int[] location = new int[2];
mainView.getLocationOnScreen(location);
int toolbarHeight = location[1];
где " mainView" - это корневой вид вашего макета.
Идея состоит в том, чтобы получить Y-позицию mainView, поскольку она установлена прямо под ActionBar (или панель инструментов).
Ответ 13
Высота панели действий отличается в зависимости от применяемой темы.
Если вы используете 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));
}
Ответ 14
В 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;
}
Ответ 15
Если вы используете Xamarin/С#, это код, который вы ищете:
var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
Ответ 16
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();
}
Ответ 17
Готовый способ выполнить самый популярный ответ:
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;
}
Ответ 18
Простой способ найти высоту панели действий - это метод Activity onPrepareOptionMenu
.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
....
int actionBarHeight = getActionBar().getHeight());
.....
}
Ответ 19
В 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()
}
});
... И возьмите последнее значение, которое оно изменило. Чтобы получить высоту.
Ответ 20
После того, как вы пробовали все, что было без успеха, я случайно обнаружил функциональный и очень простой способ получить высоту по умолчанию для панели действий.
Проверено только в API 25 и 24
С#
Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material);
Java
getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
Ответ 21
Вот обновленная версия с Kotlin, которую я использовал, предполагая, что телефон выше, чем Honeycomb:
val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
}