Comment déclarer une barre d'outils / barre d'action à hauteur étendue sur Android Lollipop?

88

J'ai vu des barres d'applications de hauteur étendue dans les directives de la barre d'applications Google Design . Comment les implémenter dans Android Lollipop?

Chris Banes
la source

Réponses:

144

Vous devez utiliser le nouveau widget de la barre d'outils pour y parvenir. La barre d'outils a une gestion spéciale pour sa hauteur minimale pour déclarer la quantité d'espace qui est utilisée pour les boutons (et les actions).

Dans l'exemple ci-dessous, nous définissons la hauteur à 128dp (qui est 56dp + 72dp comme défini dans la spécification), mais en gardant le android:minHeightcomme standard actionBarSize(qui est généralement de 56dp). Cela signifie que les boutons et les actions sont contraints d'être positionnés verticalement dans le 56dp supérieur. On peut ensuite utiliser android:gravitypour positionner le titre en bas.

<Toolbar
    android:id="@+id/toolbar"
    android:layout_height="128dp"
    android:layout_width="match_parent"
    android:minHeight="?android:attr/actionBarSize"
    android:background="?android:attr/colorPrimary"
    android:gravity="bottom" />

Si vous utilisez AppCompat, modifiez la déclaration à utiliser à la android.support.v7.widget.Toolbarplace et utilisez ses attributs.

Chris Banes
la source
3
Si l'utilisation layout_heightest la voie à suivre, je m'attends à ce que la solution de contournement décrite par mousson ici ne soit pas non plus une solution de contournement, mais la bonne voie à suivre? code.google.com/p/android/issues/detail?id=77874
Thomas Keller
3
J'aimerais aussi pouvoir déclarer des expressions pour les dimensions, mais nous ne pouvons pas.
Chris Banes
37
Pour les points bonus @dimen/action_bar_size_x2, taillez la barre d'action par incréments, par exemple , et utilisez 112dp sur les téléphones, 128dp sur les tablettes
Roman Nurik
7
android:paddingBottomintroduit un espacement étrange lorsque buttonGravityest défini sur bottom. L' titleMarginBottomattribut semble être la meilleure option ici, non?
Paul Burke
5
@RomanNurik Comment fonctionne la barre d'outils étendue dans l'application de calendrier? Tous les indices
Raghunandan
3

Merci pour votre question, sa réponse, et en plus pour l'implémentation de la barre d'outils en natif et dans la supportlibrary :)

Et nous pouvons jouer plus. Nous pouvons, au moment de l'exécution, jouer avec la hauteur et la hauteur minimale.

La hauteur est la hauteur de la barre d'outils, c'est simple, tout le monde comprend, et la gravité agit en fonction de cette hauteur.

Le minimumHeight est plus délicat et ne devrait pas être au minimum de 56dp. Ce minHeight est utilisé pour placer la ligne de votre menuItem. Cette ligne est au milieu de votre minHeight.

Vous pouvez donc ajouter ce code à votre activité pour voir par vous-même la différence. :)

Runnable toolBarAnimator=new Runnable() {
        @Override
        public void run() {
            if(postICS){
//                toolbar.setTranslationX(iteration);
//                toolbar.setElevation(iteration);
                toolbar.setMinimumHeight(iteration * 5);
                toolbar.getLayoutParams().height++;
            }
            uiThreadHanlder.postDelayed(this,16);
            iteration++;
            if(iteration>150)iteration=0;
        }
    };
    Handler uiThreadHanlder=new Handler();
    int iteration=0;


    @Override
    protected void onResume() {
        super.onResume();
        //launch the animation
        uiThreadHanlder.postDelayed(toolBarAnimator, 1000);
    }


    @Override
    protected void onPause() {
        super.onPause();
        //stop the animation
        uiThreadHanlder.removeCallbacks(toolBarAnimator);
    }

Où se trouve la barre d'outils:

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

En faisant cela, vous obtenez: entrez la description de l'image ici

mais si vous quittez l'animation continuez vous obtenez: entrez la description de l'image ici

C'est pourquoi, paramétrer votre barre d'outils android: layout_height sur wrap_content est une bonne option dans la plupart des cas, car la Toolbar adaptera sa hauteur en fonction de son contenu (et vous pourrez changer le contenu à l'exécution :)

Et c'est également ainsi que vous modifiez la taille de votre barre d'outils au moment de l'exécution.

Merci Chris Banes pour le travail incroyable que vous avez fait sur la barre d'action.

Mathias Seguy Android2ee
la source
@MohammadHadi J'imagine que postICS serait défini comme:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78