Как получить высоту ActionBar?



Я пытаюсь получить высоту ActionBar (используя Sherlock) каждый раз, когда создается действие (специально для обработки изменений конфигурации при вращении, где высота панели действий может измениться).



для этого я использую метод ActionBar.getHeight() работает только когда Это.



когда первое действие создается в первый раз, я могу позвонить getHeight() на onCreateOptionsMenu обратный. Но этот метод не вызывается после.



так что мой вопрос, когда я могу назвать getHeight() и быть уверенным, что он не возвращает 0?
Или если это невозможно, как я могу установить высоту панели действий ?

581   20  

20 ответов:

хотя ответ @birdy является опцией, если вы хотите явно контролировать размер панели действий, есть способ вытащить его без блокировки размера, который я нашел в документации по поддержке. Это немного неудобно, но это сработало для меня. Вам понадобится контекст, этот пример будет действителен в действии.

// 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"

Ок я гуглил вокруг и добраться до этого поста несколько раз, так что я думаю, что это будет хорошо, чтобы быть описаны не только для Шерлока, но и для appcompat также:

высота панели действий с помощью appCompat

довольно похож на @ Anthony описание вы можете найти его со следующим кодом(я только что изменил идентификатор ресурса):

TypedValue tv = new TypedValue();

if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
    int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

Pre Sandwitch Проблема

Мне нужна была высота панели действий, потому что на pre ICE_CREAM_SANDWITCH устройства мой взгляд перекрывал панель действий. Я попробовал установить android: layout_marginTop="?android: attr / actionBarSize", android: layout_marginTop="?attr / actionBarSize", установка перекрытия для просмотра/actionbar и даже фиксированная высота actionbar с пользовательской темой, но ничего не работало. Вот как это выглядело:

overlap problem

к сожалению, я узнал, что с описанным выше методом я получаю только половину высоты(я предполагаю, что панель опций не занята), поэтому полностью исправить isue мне нужно двойной высота панели действий и все кажется в порядке:

overlap fixed

Если кто-то знает лучшее решение(чем удвоение actionBarHeight), я буду рад сообщить мне, поскольку я пришел из разработки iOS, и я нашел большинство вещей Android view довольно запутанными :)

С уважением,

фонда.к

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

Я думаю, что самый безопасный способ будет такой :

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 вы можете создать новый 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

вы можете использовать эту функцию, чтобы получить высоту actionbar.

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.Р. привлекательными.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));
    }

Если вы используете панель инструментов как в ActionBar,

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

затем просто используйте layout_height панели инструментов.

int actionBarHeight = toolbar.getLayoutParams().height;

Если вы используете 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 mainView как это установлено прямо под панелью действий (или панели инструментов).

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

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

простой способ найти высоту панели действий - это из 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); 

Java

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

готовый метод для выполнения самого популярного ответа:

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

Comments

    Ничего не найдено.