Как получить высоту 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)
        }