Como declaro uma barra de ferramentas / ação de altura estendida no Android Lollipop?

88

Eu vi barra de aplicativos de altura estendida nas diretrizes da barra de aplicativos do Google Design . Como faço para implementar isso no Android Lollipop?

Chris Banes
fonte

Respostas:

144

Você precisa usar o novo widget da barra de ferramentas para fazer isso. A barra de ferramentas tem um tratamento especial por sua altura mínima para declarar a quantidade de espaço que é usado para botões (e ações).

No exemplo abaixo, estamos definindo a altura como 128 dp (que é 56 dp + 72 dp conforme definido na especificação), mas mantendo o android:minHeight como o padrão actionBarSize(que geralmente é 56 dp). Isso significa que os botões e ações são restritos para serem posicionados verticalmente nos 56 dp superiores. Podemos então usar android:gravitypara posicionar o título na parte inferior.

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

Se você estiver usando AppCompat, altere a declaração para usar android.support.v7.widget.Toolbar e use seus atributos.

Chris Banes
fonte
3
Se usar layout_heighté o caminho a seguir, espero que a solução alternativa descrita por monção aqui também não seja uma solução alternativa, mas o caminho certo a seguir. code.google.com/p/android/issues/detail?id=77874
Thomas Keller
3
Eu adoraria poder declarar expressões para dimensões também, mas não podemos.
Chris Banes
37
Para obter pontos de bônus, dimensione a barra de ação usando incrementos, por exemplo @dimen/action_bar_size_x2, e use 112 dp em telefones, 128 dp em tablets
Roman Nurik,
7
android:paddingBottomintroduz espaçamento estranho quando buttonGravityé definido como bottom. O titleMarginBottomatributo parece ser a melhor opção aqui, não?
Paul Burke,
5
@RomanNurik como funciona a barra de ferramentas expandida no aplicativo de calendário? Qualquer dica
Raghunandan
3

Obrigado pela sua pergunta, sua resposta e, além disso, pela implementação da barra de ferramentas no nativo e na biblioteca de suporte :)

E podemos jogar mais. Podemos, em tempo de execução, brincar com Height e MinimalHeight.

A altura é a altura do ToolBar, é simples, todo corpo entende, e a gravidade atua de acordo com essa altura.

O minimalHeight é mais complicado e não deve ter no mínimo 56 dp. Este minHeight é usado para colocar a linha de seu menuItem. Esta linha está no meio de seu minHeight.

Portanto, você pode adicionar esse código à sua atividade para ver por si mesmo a diferença. :)

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

Onde a barra de ferramentas está:

barra de ferramentas = (Barra de ferramentas) findViewById (R.id.toolbar);

Ao fazer isso, você obtém: insira a descrição da imagem aqui

mas se você deixar a animação continuar, obterá: insira a descrição da imagem aqui

É por isso que definir sua barra de ferramentas android: layout_height como wrap_content é uma boa opção na maioria dos casos, porque a barra de ferramentas irá adaptar sua altura de acordo com seu conteúdo (e você pode alterar o conteúdo em tempo de execução :)

E também é assim que você altera o tamanho da barra de ferramentas em tempo de execução.

Obrigado Chris Banes pelo trabalho incrível que você fez na barra de ação.

Mathias Seguy Android2ee
fonte
@MohammadHadi Estou imaginando que o postICS seria definido como:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78