Intereting Posts
Как производительность эмулятора Android сравнима с реальной производительностью устройства? Лучший контейнер IOC для Android и мобильных устройств Как сделать овальную форму tabhost в android Страница Curl Animation в андроиде? Android: передать параметр службе из Activity TextView с использованием Spannable – эллипсис не работает Тестирование JVM-модуля с помощью Mockito для тестирования Retrofit2 и RxJava для сетевых запросов Как распечатать возвращаемое сообщение из HttpResponse? Как применить стиль ко всем кнопкам приложения для Android Как я могу разместить меню переполнения под панелью инструментов вместо меню переполнения, чтобы перекрывать панель приложений Установить фоновое изображение и xml-ресурс Java.lang.SecurityException: MODE_WORLD_READABLE больше не поддерживается Почему событие touchstart после клика? Одновременно применять одну анимацию к нескольким представлениям Android AllJoyn: подключение со второй машиной приводит к ошибке BusAttachement

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

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

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

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

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

Solutions Collecting From Web of "Как получить высоту ActionBar?"

Хотя ответ @ birdy является вариантом, если вы хотите явно контролировать размер 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()); } 

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

Хорошо, что я собирался погулять и добираться до этого поста несколько раз, поэтому считаю, что будет хорошо описываться не только для Шерлока, но и для 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", устанавливая перекрытие для просмотра / панели действий и даже фиксированную высоту панели действий с пользовательской темой, но ничего не работало. Вот как это выглядело:

Проблема перекрытия

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

Перекрытие фиксировано

Если кто-то знает лучшее решение (чем удвоение 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 вы можете создать новую 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" 

Ява:

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

Вам просто нужно добавить это.

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

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

 public int getActionBarHeight() { final TypedArray ta = getContext().getTheme().obtainStyledAttributes( new int[] {android.R.attr.actionBarSize}); int actionBarHeight = (int) ta.getDimension(0, 0); return actionBarHeight; } 

Высота панели действий отличается в зависимости от применяемой темы. Если вы используете 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)); } 

Если вы используете 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, поскольку она установлена ​​прямо под 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(); } 

Простой способ найти высоту панели действий – onPrepareOptionMenu метод 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 (используя 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);