Wie deklariere ich eine Symbolleiste / Aktionsleiste mit erweiterter Höhe auf Android Lollipop?

88

Ich habe App-Leisten mit erweiterter Höhe in den Richtlinien für Google Design App- Leisten gesehen. Wie implementiere ich diese in Android Lollipop?

Chris Banes
quelle

Antworten:

144

Sie müssen das neue Symbolleisten- Widget verwenden, um dies zu erreichen. Die Symbolleiste verfügt über eine spezielle Behandlung für die Mindesthöhe, um den Platz anzugeben, der für Schaltflächen (und Aktionen) verwendet wird.

Im folgenden Beispiel stellen wir die Höhe auf 128 dp ein (dies entspricht 56 ​​dp + 72 dp, wie in der Spezifikation definiert), behalten jedoch android:minHeightdie Standardeinstellung bei actionBarSize(normalerweise 56 dp). Dies bedeutet, dass die Schaltflächen und Aktionen nur vertikal in den oberen 56 dp positioniert werden müssen. Wir können dann verwenden, android:gravityum den Titel unten zu positionieren.

<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" />

Wenn Sie AppCompat verwenden, ändern Sie die zu verwendende Deklaration android.support.v7.widget.Toolbarund verwenden Sie deren Attribute.

Chris Banes
quelle
3
Wenn die Verwendung layout_heightder richtige Weg ist, erwarte ich, dass die hier vom Monsun beschriebene Problemumgehung auch keine Problemumgehung ist, sondern der richtige Weg? code.google.com/p/android/issues/detail?id=77874
Thomas Keller
3
Ich würde gerne auch Ausdrücke für Dimensionen deklarieren können, aber wir können nicht.
Chris Banes
37
Für Bonuspunkte @dimen/action_bar_size_x2skalieren Sie die Aktionsleiste in Schritten, z. B. , und verwenden Sie 112dp auf Telefonen, 128dp auf Tablets
Roman Nurik
7
android:paddingBottomführt einen seltsamen Abstand ein, wenn eingestellt buttonGravityist bottom. Das titleMarginBottomAttribut scheint hier die bessere Option zu sein, oder?
Paul Burke
5
@RomanNurik Wie funktioniert die erweiterte Symbolleiste in der Kalender-App? Irgendwelche Hinweise
Raghunandan
3

Vielen Dank für Ihre Frage, ihre Antwort und darüber hinaus für die Implementierung der Symbolleiste in der nativen und der Support-Bibliothek :)

Und wir können mehr spielen. Wir können zur Laufzeit mit der Höhe und der minimalen Höhe spielen.

Die Höhe ist die Höhe der ToolBar, sie ist einfach, jeder Körper versteht sie und die Schwerkraft wirkt entsprechend dieser Höhe.

Die minimale Höhe ist kniffliger und sollte nicht mindestens 56 dp betragen. Diese minHeight wird verwendet, um die Zeile Ihres menuItem zu platzieren. Diese Zeile befindet sich in der Mitte Ihrer Mindesthöhe.

Sie können diesen Code also zu Ihrer Aktivität hinzufügen, um den Unterschied selbst zu erkennen. :) :)

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

Wo sich die Symbolleiste befindet:

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

Wenn Sie dies tun, erhalten Sie: Geben Sie hier die Bildbeschreibung ein

Wenn Sie die Animation jedoch fortsetzen, erhalten Sie: Geben Sie hier die Bildbeschreibung ein

Aus diesem Grund ist es in den meisten Fällen eine gute Option, die Symbolleiste android: layout_height auf wrap_content zu setzen, da die Symbolleiste ihre Höhe an den Inhalt anpasst (und Sie den Inhalt zur Laufzeit ändern können :)

Auf diese Weise können Sie auch die Größe Ihrer Symbolleiste zur Laufzeit ändern.

Vielen Dank an Chris Banes für die großartige Arbeit, die Sie an der Actionbar geleistet haben.

Mathias Seguy Android2ee
quelle
@MohammadHadi Ich stelle mir vor, dass PostICS so definiert werden würde wie:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78