Comment obtenir la hauteur de l'ActionBar?

193

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

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

Lorsque la première activité est créée pour la première fois, je peux appeler getHeight()le onCreateOptionsMenurappel. Mais cette méthode n'est pas appelée après.

Ma question est donc de savoir quand puis-je appeler getHeight () et être assuré qu'il ne renvoie pas 0? Ou si ce n'est pas possible, comment puis-je régler la hauteur de l'ActionBar?

znat
la source

Réponses:

425

Bien que la réponse de @ birdy soit une option si vous souhaitez contrôler explicitement la taille de l'ActionBar, il existe un moyen de la remonter sans verrouiller la taille que j'ai trouvée dans la documentation de support. C'est un peu gênant mais ça a marché 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))
{
    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)
}
Anthony
la source
13
grande aide !! mais d'où vous trouvez toutes ces choses !!
vikky
5
Généralement à partir de Google exhaustif ou de traîner dans le manuel du développeur. Je pense que ce dernier dans ce cas, mais ça fait un moment.
Anthony
1
Pouvons-nous modifier la taille de la barre d'actions uniquement pour une activité particulière?
Sudarshan Bhat
Cela a fonctionné pour moi dans les deux cas: (i) onCreateView et (ii) onConfigurationChanged. Merci!
Marcelo Noguti
5
"android.R.attr.actionBarSize" ne fonctionne pas dans la version Android 2.3, mais "R.attr.actionBarSize" fonctionne sur toute la version Android. utilisez simplement "R.attr.actionBarSize" au lieu de "android.R.attr.actionBarSize", "android.support.v7.appcompat.R.attr.actionBarSize" et etc.
Nathaniel Jobs
148

En XML, vous devez utiliser cet attribut:

android:paddingTop="?android:attr/actionBarSize"
cesards
la source
20
au cas où vous utiliseriez ActionBarCompat "@ dimen / abc_action_bar_default_height"
Ali AlNoaimi
10
Merci Ali AlNoaimi! Avec AppCompat v21, le nom est devenu: "@ dimen / abc_action_bar_default_height_material"
Tony Ceralva
5
Comme @muzikant mentionné ci-dessous, pour appcompat, si vous souhaitez l'utiliser dans le code, l'attribut correct est android.support.v7.appcompat.R.attr.actionBarSize. Si vous voulez l' utiliser dans la mise en page XML, android:paddingTop="?attr/actionBarSize". Fonctionne bien partout.
rpattabi
1
Cette solution est merveilleuse lorsque vous utilisez une mise en page XML personnalisée.
tryp
2
Si je veux utiliser cet attr mais négatif, utilisez-le avec un rembourrage négatif. Comment puis je faire ça?
Développeur Tiger
17

Ok, je cherchais plusieurs fois sur Google et j'arrivais à ce post plusieurs fois, donc je pense que ce sera bien 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 la trouver avec le code suivant (je viens de changer 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é-sandwitch

J'avais besoin de la hauteur de la barre d'action car sur les appareils pré ICE_CREAM_SANDWITCH, ma vue chevauchait la barre d'action. J'ai essayé de paramétrer android: layout_marginTop = "? Android: attr / actionBarSize", android: layout_marginTop = "? Attr / actionBarSize", paramétrer le chevauchement pour afficher / actionbar et même fixer la hauteur de la barre d'action avec un thème personnalisé mais rien n'a fonctionné. Voilà à quoi ça ressemblait:

problème de chevauchement

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 doubler la hauteur de la barre d'action et tout semble correct:

chevauchement fixe

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 j'ai trouvé la plupart des choses de la vue Android assez déroutantes :)

Cordialement,

hris.to

hris.to
la source
J'ai vécu la même chose lors de l'utilisation des onglets. Le problème est qu'il est parfois difficile de détecter les onglets et pas d'onglets, car certains appareils réduisent visuellement les onglets dans l'ActionBar de base dans certaines situations. Donc, ce qui a fonctionné pour moi est juste ActionBar.getHeight(). Selon la situation, cela peut également fonctionner pour vous.
TalkLittle
J'étais confronté au problème car je ne considérais que la hauteur de la barre d'action, puis j'ai également ajouté la hauteur de la `` barre de notification ''. Ça a bien marché pour moi.
Darpan
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.
Oliv
16

@Anthony answer fonctionne pour les appareils qui prennent en charge ActionBaret pour les appareils qui ne prennent en charge que la Sherlock Action Barmé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());
   }
laaptu
la source
Vous pouvez encapsuler 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.
Marina.Eariel
Pour moi, j'ai com.actionbarsherlock.R.attr.actionBarSizetravaillé pour Android 2.3 et 4.0, il semble donc que vous puissiez l'utiliser quelle que soit la version d'Android.
Felix
13

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;
}
développeur android
la source
9
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()); }
Muzikant
3
"if (true =="? Je pense que vous pouvez supprimer le "vrai" ... :)
développeur android
Ouais, vous avez raison ... c'est juste ajouté pour plus de clarté
Muzikant
D'après votre code, il semble que peu importe si j'utilise ABS, dans toutes les versions ci-dessus HONEYCOMB, il prendra la hauteur de la barre d'action de android.R.attr.actionBarSize. Est-ce correct ?
AsafK
est-ce quand même de spécifier la demi-barre d'action pour cacher le haut de l'écran? stackoverflow.com/questions/27163374/…
Steve
6

Pour définir la hauteur de ActionBarvous pouvez créer de nouveaux Themecomme 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 définissez ceci Themesur votre Activity:

android:theme="@style/Theme.FixedSize"
birdy
la source
1
Notez que la hauteur de la barre d'action est plus petite en mode paysage.
Mark Buikema
Je ne le recommande pas car actionBarSherlock prend beaucoup en compte lors du choix de la hauteur de la barre d'action. Si vous faites cela, la hauteur de l'actionBar ne sera pas basée sur les spécifications de l'appareil et ne ressemblera donc pas à la hauteur standard pour certains appareils.
Chris Sprague
5

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
TeeTracker
la source
5

Si vous utilisez une barre d'outils comme ActionBar,

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

puis utilisez simplement le layout_height de la barre d'outils.

int actionBarHeight = toolbar.getLayoutParams().height;
jk7
la source
3

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;
}
wangzhengyi
la source
3

Une méthode prête pour 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;
}
Zon
la source
2

Cette méthode d'aide 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();
        }
    }
}
Simon
la source
2

il vous suffit d'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;
    }
JCDecary
la source
2

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 de la vue principale telle qu'elle est définie juste en dessous de la barre d'action (ou de la barre d'outils).

Alécio Carvalho
la source
2

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

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

En xml, vous pouvez utiliser? Attr / actionBarSize, mais si vous avez besoin d'accéder à cette valeur en 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;
    }
Faxriddin Abdullayev
la source
2

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

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

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();
Fred
la source
1
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();
}
Devraj Singh
la source
0

Un moyen simple de trouver la hauteur de la barre d'action consiste à utiliser la onPrepareOptionMenuméthode Activity .

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

Dans javafx (en utilisant Gluon), la hauteur est définie à l'exécution ou quelque chose comme ça. 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 prenez la valeur la plus récente à laquelle il a changé. Pour avoir de la hauteur.

Lealo
la source
0

Après avoir essayé tout ce qui existe sans succès, j'ai découvert, par accident, un moyen fonctionnel et très simple d'obtenir la hauteur par défaut de la barre d'action.

Uniquement testé en 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);
Rafael Pereira
la source