Jak zadeklarować pasek narzędzi / pasek akcji o zwiększonej wysokości w systemie Android Lollipop?

88

Widziałem rozszerzonych wysokość aplikacja baru w Google Projektowanie App Bar wytycznych. Jak zaimplementować je w Android Lollipop?

Chris Banes
źródło

Odpowiedzi:

144

Aby to osiągnąć, musisz użyć nowego widżetu Toolbar . Pasek narzędzi ma specjalną obsługę dla jego minimalnej wysokości, aby zadeklarować ilość miejsca używanego na przyciski (i akcje).

W poniższym przykładzie ustawiamy wysokość na 128 dp (czyli 56 dp + 72 dp zgodnie z definicją w specyfikacji), ale zachowując android:minHeightstandard actionBarSize(zwykle 56 dp). Oznacza to, że przyciski i akcje są ograniczone do umieszczania w pionie w górnym 56 dp. Następnie możemy użyć, android:gravityaby umieścić tytuł na dole.

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

Jeśli używasz AppCompat, zmień deklarację, która ma być używana, android.support.v7.widget.Toolbari użyj jej atrybutów.

Chris Banes
źródło
3
Jeśli używanie layout_heightjest właściwą drogą, spodziewam się, że obejście opisane tutaj przez monsun również nie jest obejściem, ale właściwą drogą? code.google.com/p/android/issues/detail?id=77874
Thomas Keller
3
Bardzo chciałbym móc zadeklarować wyrażenia dla wymiarów, ale nie możemy.
Chris Banes
37
Aby uzyskać dodatkowe punkty, zwiększaj pasek akcji, używając przyrostów, np. @dimen/action_bar_size_x2I używaj 112 dp na telefonach, 128 dp na tabletach
Roman Nurik
7
android:paddingBottomwprowadza dziwne odstępy, gdy buttonGravityjest ustawione na bottom. titleMarginBottomAtrybut wydaje się lepszą opcją tu, nie?
Paul Burke,
5
@RomanNurik Jak działa rozszerzony pasek narzędzi w aplikacji kalendarza? Wszelkie wskazówki
Raghunandan
3

Dziękuję za pytanie, odpowiedź, a ponadto za implementację paska narzędzi w bibliotece natywnej i pomocniczej :)

I możemy grać więcej. W czasie wykonywania możemy bawić się parametrami Height i MinimalHeight.

Wysokość to wysokość paska narzędzi, jest prosta, każdy organizm rozumie, a grawitacja działa zgodnie z tą wysokością.

Minimalna wysokość jest trudniejsza i nie powinna wynosić minimum 56 dp. Ta minHeight jest używana do umieszczania linii twojego menuItem. Ta linia znajduje się w połowie twojego minHeight.

Możesz więc dodać ten kod do swojej aktywności, aby samemu zobaczyć różnicę. :)

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

Gdzie pasek narzędzi to:

toolbar = (Pasek narzędzi) findViewById (R.id.toolbar);

W ten sposób otrzymujesz: wprowadź opis obrazu tutaj

ale jeśli opuścisz animację kontynuuj, otrzymasz: wprowadź opis obrazu tutaj

Dlatego ustawienie paska narzędzi android: layout_height na wrap_content jest dobrą opcją w większości przypadków, ponieważ pasek narzędzi dostosuje swoją wysokość do zawartości (i możesz zmieniać zawartość w czasie wykonywania :)

W ten sposób zmieniasz również rozmiar paska narzędzi w czasie wykonywania.

Dziękuję Chrisowi Banesowi za niesamowitą pracę, którą wykonałeś na pasku akcji.

Mathias Seguy Android2ee
źródło
@MohammadHadi Wyobrażam sobie, że postICS zostanie zdefiniowany w następujący sposób:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78