Как получить высоту ActionBar?
Я пытаюсь получить высоту ActionBar (используя Sherlock) каждый раз, когда создается действие (специально для обработки изменений конфигурации при вращении, где высота панели действий может измениться).
для этого я использую метод ActionBar.getHeight() работает только когда Это.
когда первое действие создается в первый раз, я могу позвонить getHeight() на onCreateOptionsMenu обратный. Но этот метод не вызывается после.
так что мой вопрос, когда я могу назвать getHeight() и быть уверенным, что он не возвращает 0?
Или если это невозможно, как я могу установить высоту панели действий ?
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()); }
Ок я гуглил вокруг и добраться до этого поста несколько раз, так что я думаю, что это будет хорошо, чтобы быть описаны не только для Шерлока, но и для 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 с пользовательской темой, но ничего не работало. Вот как это выглядело:
к сожалению, я узнал, что с описанным выше методом я получаю только половину высоты(я предполагаю, что панель опций не занята), поэтому полностью исправить isue мне нужно двойной высота панели действий и все кажется в порядке:
Если кто-то знает лучшее решение(чем удвоение 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