213 votes

Comment obtenir la hauteur de la barre d'action ?

J'essaie d'obtenir la hauteur de la ActionBar (en utilisant Sherlock) à chaque fois qu'une activité est créée (notamment pour gérer les changements de configuration lors de la rotation où la hauteur de la barre d'action peut changer).

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() en el onCreateOptionsMenu callback. Mais cette méthode n'est pas appelée après.

Ma question est donc la suivante : quand puis-je appeler getHeight() et être sûr qu'il ne renvoie pas 0 ? Ou si ce n'est pas possible, comment puis-je définir la hauteur de la barre d'action ?

453voto

Anthony Points 1697

Bien que la réponse de @birdy soit une option si vous souhaitez contrôler explicitement la taille de la barre d'action, il existe un moyen de la faire remonter sans verrouiller la taille que j'ai trouvé dans la documentation d'assistance. C'est un peu délicat, mais cela a fonctionné pour moi. Vous aurez besoin d'un contexte, cet exemple serait valable dans une activité.

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

Kotlin :

val tv = TypedValue()
if (requireActivity().theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
    val actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
}

14 votes

Grande aide ! ! mais d'où vient ce genre de choses ! !!

5 votes

Généralement à partir d'une recherche exhaustive sur Google ou d'une lecture laborieuse du manuel du développeur. Je pense que c'est le dernier dans ce cas, mais ça fait un moment.

1 votes

Peut-on modifier la taille de la barre d'action uniquement pour une activité particulière ?

157voto

m3n0R Points 2333

En XML, vous devez utiliser cet attribut :

android:paddingTop="?android:attr/actionBarSize"

0 votes

Je pense qu'il veut dire : "?android:attr/actionBarSize"

20 votes

Dans le cas où vous utilisez ActionBarCompat "@dimen/abc_action_bar_default_height"

10 votes

Merci Ali AlNoaimi ! Avec AppCompat v21 le nom a changé en : "@dimen/abc_action_bar_default_height_material"

18voto

hris.to Points 269

Ok, j'ai fait des recherches et je suis arrivé plusieurs fois sur ce post, donc je pense qu'il sera bon d'être décrit non seulement pour Sherlock mais aussi pour appcompat :

Hauteur de la barre d'action avec appCompat

Assez similaire à la description de @Anthony, vous pouvez le trouver avec le code suivant (j'ai juste changé l'id 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 de pré-sandwich

J'avais besoin de la hauteur de la barre d'action parce que sur les appareils pré-ICE_CREAM_SANDWITCH, ma vue recouvrait la barre d'action. J'ai essayé de définir Android:layout_marginTop="?Android:attr/actionBarSize", Android:layout_marginTop="?attr/actionBarSize", de désactiver le chevauchement dans view/actionbar et même de fixer la hauteur de la barre d'action avec un thème personnalisé, mais rien n'a fonctionné. 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 mise en place), donc pour résoudre complètement le problème, je dois double hauteur de la barre d'action et tout semble correct :

overlap fixed

Si quelqu'un connaît une meilleure solution (que de doubler la hauteur de la barre d'action), je serai heureux de le faire savoir car je viens du développement iOS et j'ai trouvé la plupart des choses de la vue Android assez confuses :)

Regards,

hris.to

0 votes

J'ai connu la même chose en utilisant des onglets. Le problème est qu'il est parfois difficile de détecter les onglets par rapport à l'absence d'onglets, car certains périphériques réduisent visuellement les onglets dans la barre d'action de base dans certaines situations. Ce qui a fonctionné pour moi, c'est ActionBar.getHeight() . En fonction de la situation, cela peut aussi fonctionner pour vous.

0 votes

J'étais confronté à ce problème parce que je ne tenais compte que de la hauteur de la barre d'action, puis j'ai ajouté la hauteur de la barre de notification. Cela a bien fonctionné pour moi.

0 votes

Utilisez-vous FrameLayout et avez-vous layout_gravity="center_vertical" ? Changez-le en "bottom" . Android 2.3 gère la marge dans FrameLaoyut différemment des androïdes plus récents.

16voto

laaptu Points 655

La réponse de @Anthony fonctionne pour les appareils qui prennent en charge les éléments suivants ActionBar et pour les appareils qui ne supportent que 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());
   }

0 votes

Vous pourriez envelopper le premier if avec "if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {}" pour éviter les erreurs d'exécution sur les anciennes versions d'Android.

0 votes

Pour moi com.actionbarsherlock.R.attr.actionBarSize a fonctionné à la fois pour Android 2.3 et 4.0, il semble donc que vous puissiez l'utiliser quelle que soit la version d'Android.

14voto

android developer Points 20939

Je pense que le moyen le plus sûr serait de :

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

9 votes

Si vous utilisez appcompat, ajoutez ce qui suit : else if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }

3 votes

"if (true== " ? Je pense que vous pouvez enlever le "true"... :)

0 votes

Oui, tu as raison... c'est juste ajouté pour la clarté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X