example - show action bar android
¿Cómo obtener la altura de ActionBar? (19)
Estoy tratando de obtener la altura de la ActionBar
de ActionBar
(usando Sherlock) cada vez que se crea una actividad (especialmente para manejar cambios de configuración en la rotación donde la altura de la barra de acción puede cambiar).
Para esto utilizo el método ActionBar.getHeight()
que solo funciona cuando se muestra la ActionBar
.
Cuando se crea la primera actividad por primera vez, puedo llamar a getHeight()
en la onCreateOptionsMenu
llamada onCreateOptionsMenu
. Pero este método no se llama después.
Entonces mi pregunta es cuándo puedo llamar a getHeight () y estar seguro de que no devuelve 0? O si no es posible, ¿cómo puedo establecer la altura de la barra de acciones?
Creo que la forma más segura sería:
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;
}
Después de probar todo lo que hay por ahí sin éxito, descubrí, por accidente, una forma funcional y muy fácil de obtener la altura predeterminada de la barra de acción.
Solo probado en API 25 y 24
DO#
Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material);
Java
getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
En XML, debes usar este atributo:
android:paddingTop="?android:attr/actionBarSize"
En javafx (usando Gluon), la altura se establece en tiempo de ejecución o algo así. Si bien se puede obtener el ancho al igual que en el normal ...
double width = appBar.getWidth();
Tienes que crear un oyente:
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()
}
});
... Y tome el valor más reciente al que cambió. Para obtener la altura.
En xml, puede usar? Attr / actionBarSize, pero si necesita acceder a ese valor en Java, debe usar el siguiente código:
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;
}
Encontré una forma más genérica para descubrirlo:
int[] location = new int[2];
mainView.getLocationOnScreen(location);
int toolbarHeight = location[1];
donde '' mainView '' es la vista raíz de su diseño.
La idea es, básicamente, obtener la posición Y de la vista principal, ya que se encuentra justo debajo de la Barra de acciones (o la Barra de herramientas).
Este método de ayuda debería ser útil para alguien. Ejemplo: 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();
}
}
}
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
La altura de la barra de acción varía de acuerdo con el tema aplicado. Si usa AppCompatActivity, la altura será diferente en la mayoría de los casos de la actividad normal.
Si está utilizando AppCompatActivity , debe usar R.attr.actionBarSize en lugar de 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));
}
La respuesta @Anthony funciona para dispositivos que admiten ActionBar
y para aquellos dispositivos que solo admiten el uso del método de seguimiento 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());
}
Ok, estaba buscando en Google y llegué a este post varias veces, así que creo que será bueno que se describa no solo para Sherlock sino también para el appcompat:
Altura de la barra de acción con la aplicaciónCompat
Muy similar a la descripción de @Anthony lo puedes encontrar con el siguiente código (acabo de cambiar la identificación del recurso):
TypedValue tv = new TypedValue();
if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
Problema previo a Sandwitch
Necesitaba la altura de la barra de acción porque en los dispositivos pre ICE_CREAM_SANDWITCH mi vista se superponía a la barra de acciones. Intenté configurar android: layout_marginTop = "? Android: attr / actionBarSize", android: layout_marginTop = "? Attr / actionBarSize", desactivando la superposición para ver / barra de acciones e incluso fijé la altura de la barra de acciones con el tema personalizado pero nada funcionó. Así es como se veía:
Desafortunadamente, descubrí que con el método descrito anteriormente obtengo solo la mitad de la altura (supongo que la barra de opciones no está en su lugar) así que para arreglar completamente el isue necesito duplicar la altura de la barra de acción y todo parece estar bien:
Si alguien conoce mejor solución (que duplicar actionBarHeight), me alegrará decirme que vengo del desarrollo de iOS y encontré que la mayoría de las cosas de Android View son bastante confusas :)
Saludos,
hris.to
Para establecer la altura de ActionBar
puede crear un nuevo Theme
como este:
<?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>
y establece este Theme
para tu Activity
:
android:theme="@style/Theme.FixedSize"
Si bien la respuesta de @ birdy es una opción si desea controlar explícitamente el tamaño de la barra de acciones, hay una forma de aumentarla sin bloquear el tamaño que encontré en la documentación de soporte. Es un poco incomodo pero me funcionó. Necesitarás un contexto, este ejemplo sería válido en una Actividad.
// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
Si está usando Xamarin / C #, este es el código que está buscando:
var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
Si está utilizando una barra de herramientas como ActionBar,
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
entonces solo usa el layout_height de la barra de herramientas.
int actionBarHeight = toolbar.getLayoutParams().height;
Una forma simple de encontrar la altura de la barra de acciones es del método Activity onPrepareOptionMenu
.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
....
int actionBarHeight = getActionBar().getHeight());
.....
}
puede usar esta función para obtener la altura de la barra de acciones.
public int getActionBarHeight() {
final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
new int[] {android.R.attr.actionBarSize});
int actionBarHeight = (int) ta.getDimension(0, 0);
return actionBarHeight;
}
solo tienes que agregar esto.
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;
}
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();
}