web-dev-qa-db-fra.com

Comment obtenir la hauteur de la barre Action?

J'essaie d'obtenir la hauteur de ActionBar (à l'aide de Sherlock) chaque fois qu'une activité est créée (spécialement pour gérer les modifications de configuration en rotation, la hauteur de la barre Action pouvant être modifiée).

Pour cela, j'utilise la méthode ActionBar.getHeight() qui ne fonctionne que lorsque le ActionBar est affiché.

Lorsque la première activité est créée pour la première fois, je peux appeler getHeight() dans le rappel onCreateOptionsMenu. Mais cette méthode ne s'appelle pas après.

Donc ma question est quand puis-je appeler getHeight () et être assuré qu'il ne retourne pas 0? Ou, si ce n’est pas possible, comment puis-je régler la hauteur de la barre d’action?

174
znat

Si la réponse de @ birdy est une option si vous souhaitez contrôler explicitement la taille de la barre d’action, il existe un moyen de la récupérer sans verrouiller la taille que j’ai trouvée dans la documentation de support. C'est un peu gênant mais cela a fonctionné pour moi. Vous aurez besoin d'un contexte, cet exemple serait valide dans une activité.

// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
{
    actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
396
Anthony

En XML, vous devriez utiliser cet attribut:

Android:paddingTop="?android:attr/actionBarSize"
140
cesards

Ok, je cherchais dans ce post plusieurs fois, alors je pense que ce sera bien de décrire non seulement Sherlock, mais aussi appcompat:

hauteur de la barre d'action en utilisant appCompat

Assez similaire à la description de @Anthony, vous pouvez le trouver avec le code suivant (je viens de changer l'identifiant de la ressource):

TypedValue tv = new TypedValue();

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

Problème avant Sandwitch

J'avais besoin de la hauteur de la barre d'action car, sur les périphériques antérieurs à ICE_CREAM_SANDWITCH, ma vue chevauchait la barre d'action. J'ai essayé de configurer Android: layout_marginTop = "? Android: attr/actionBarSize", Android: layout_marginTop = "? Attr/actionBarSize", le chevauchement de l'affichage/barre d'actions et même la hauteur fixe de la barre d'actions avec un thème personnalisé, mais rien ne fonctionnait. Voilà à quoi ça ressemblait:

overlap problem

Malheureusement, j’ai découvert qu’avec la méthode décrite ci-dessus, je n’obtiens que la moitié de la hauteur (je suppose que la barre d’options n’est pas prise en place), donc pour corriger complètement l’isue il me faut double hauteur de la barre d’action et tout le reste Semble ok:

overlap fixed

Si quelqu'un connaît une meilleure solution (que de doubler actionBarHeight), je serai heureux de me le faire savoir car je viens du développement iOS et que j'ai trouvé la plupart des Android vues assez déroutantes :)

Cordialement,

hris.to

16
hris.to

@Anthony answer fonctionne pour les périphériques prenant en charge ActionBar et pour ceux qui prennent en charge uniquement Sherlock Action Bar, la méthode suivante doit être utilisée

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

je pense que le moyen le plus sûr serait:

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;
}
13
android developer

Pour définir la hauteur de ActionBar, vous pouvez créer un nouveau Theme comme celui-ci:

<?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>

et réglez cette Theme sur votre Activity:

Android:theme="@style/Theme.FixedSize"
6
birdy

Si vous utilisez une barre d’outils comme ActionBar,

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

ensuite, utilisez simplement layout_height de la barre d’outils.

int actionBarHeight = toolbar.getLayoutParams().height;
5
jk7

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
4
TeeTracker

vous pouvez utiliser cette fonction pour obtenir la hauteur de la barre d’action.

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

Cette méthode d'assistance devrait être utile pour quelqu'un. Exemple: 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();
        }
    }
}
2
Simon

vous devez juste ajouter ceci.

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

En XML, vous pouvez utiliser? Attr/actionBarSize, mais si vous avez besoin d'accéder à cette valeur dans Java, vous devez utiliser le code ci-dessous:

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;
    }
2
Faxriddin Abdullayev

La hauteur de la barre d'action diffère selon le thème appliqué. Si vous utilisez AppCompatActivity, la hauteur sera dans la plupart des cas différente de l'activité normale.

Si vous utilisez AppCompatActivity, vous devez utiliser R.attr.actionBarSize au lieu d’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));
    }
2
Mahmoud Shahoud

J'ai trouvé un moyen plus générique de le découvrir:

  int[] location = new int[2];
  mainView.getLocationOnScreen(location);
  int toolbarHeight = location[1];

où 'mainView' est la vue racine de votre mise en page.

L'idée est essentiellement d'obtenir la position Y du mainView tel qu'il est défini juste en dessous du ActionBar (ou barre d'outils).

2
Alécio Carvalho

Si vous utilisez Xamarin/C #, voici le code que vous recherchez:

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
1
Fred

Une méthode prête à répondre à la réponse la plus populaire:

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;
}
1
Zon
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();
}
1
Devraj Singh

Après avoir essayé tout ce qui se passe là-bas sans succès, j'ai découvert par hasard un moyen fonctionnel et très facile d'obtenir la hauteur par défaut de la barre d'action.

Testé uniquement dans les API 25 et 24

C #

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

Java

getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
0
Rafael Pereira

Voici une version mise à jour avec Kotlin que j'ai utilisée en supposant que le téléphone est supérieur à Honeycomb:

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(Android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }
0
bboyairwreck

Dans javafx (avec Gluon), la hauteur est définie au moment de l'exécution ou à un niveau similaire. Tout en étant capable d'obtenir la largeur comme d'habitude ...

double width = appBar.getWidth();

Vous devez créer un auditeur:

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

... et prenons la valeur la plus récente pour laquelle elle a changé. Pour avoir la hauteur.

0
Lealo

Un moyen simple de trouver la hauteur de la barre d’action consiste à utiliser la méthode Activity onPrepareOptionMenu.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }
0
Ashish Jha