¿Cómo declaro una barra de herramientas / barra de acción de altura extendida en Android Lollipop?

Respuestas:

144

Necesita utilizar el nuevo widget de la barra de herramientas para lograr esto. La barra de herramientas tiene un manejo especial para su altura mínima para declarar la cantidad de espacio que se usa para botones (y acciones).

En el siguiente ejemplo, estamos configurando la altura en 128dp (que es 56dp + 72dp como se define en la especificación), pero manteniendo android:minHeightcomo estándar actionBarSize(que generalmente es 56dp). Esto significa que los botones y acciones están restringidos para colocarse verticalmente en los 56dp superiores. Luego podemos usar android:gravitypara colocar el título en la 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" />

Si está usando AppCompat, cambie la declaración para usar android.support.v7.widget.Toolbaren su lugar y use sus atributos.

Chris Banes
fuente
3
Si usar layout_heightes el camino a seguir, espero que la solución descrita por monzón aquí tampoco sea una solución, pero ¿la manera correcta de hacerlo? code.google.com/p/android/issues/detail?id=77874
Thomas Keller
3
Me encantaría poder declarar expresiones para dimensiones también, pero no podemos.
Chris Banes
37
Para obtener puntos de bonificación @dimen/action_bar_size_x2, cambie el tamaño de la barra de acción usando incrementos, por ejemplo , y use 112dp en teléfonos, 128dp en tabletas
Roman Nurik
7
android:paddingBottomintroduce un espaciado extraño cuando buttonGravityse establece en bottom. El titleMarginBottomatributo parece la mejor opción aquí, ¿no?
Paul Burke
5
@RomanNurik ¿cómo funciona la barra de herramientas ampliada en la aplicación de calendario? Cualquier pista
Raghunandan
3

Gracias por tu pregunta, su respuesta y además por la implementación de la barra de herramientas en la biblioteca nativa y de soporte :)

Y podemos jugar más. Podemos, en tiempo de ejecución, jugar con la altura y la altura mínima.

La altura es la altura de la barra de herramientas, es simple, todos los cuerpos lo entienden y la gravedad actúa de acuerdo con esa altura.

La altura mínima es más complicada y no debe tener un mínimo de 56 dp. Este minHeight se utiliza para colocar la línea de su menuItem. Esta línea está en el medio de su minHeight.

Entonces puedes agregar este código a tu actividad para ver por ti mismo la diferencia. :)

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

Donde la barra de herramientas es:

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

Al hacer esto obtienes: ingrese la descripción de la imagen aquí

pero si dejas la animación continuar obtienes: ingrese la descripción de la imagen aquí

Por eso, configurar tu barra de herramientas android: layout_height en wrap_content es una buena opción en la mayoría de los casos, porque la barra de herramientas adaptará su altura de acuerdo con su contenido (y puedes cambiar el contenido en tiempo de ejecución :)

Y así es también como cambia el tamaño de la barra de herramientas en tiempo de ejecución.

Gracias Chris Banes por el increíble trabajo que hiciste en la barra de acción.

Mathias Seguy Android2ee
fuente
@MohammadHadi Me estoy imaginando que postICS se definiría algo como:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78