Cómo implementar DrawerArrowToggle desde Android appcompat v7 21 biblioteca


Así que ahora que Android 5.0 fue lanzado me preguntaba cómo implementar los iconos animados actionbar.

Esta biblioteca aquí lo implementa bien para mí, pero ya que la biblioteca appcompat v7 lo tiene, ¿cómo se puede implementar?

La biblioteca lo hace referencia en temas.xml

 <item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>

Bajo este estilo

 <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">

ACTUALIZAR

Tengo esto implementado usando el DrawerToggle v7. Sin embargo no puedo estilizarlo. Por favor Ayuda

Encontré el estilo para ello en el v7 styles_base.xml

<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
    <item name="color">?android:attr/textColorSecondary</item>
    <item name="thickness">2dp</item>
    <item name="barSize">18dp</item>
    <item name="gapBetweenBars">3dp</item>
    <item name="topBottomBarArrowSize">11.31dp</item>
    <item name="middleBarArrowSize">16dp</item>
    <item name="drawableSize">24dp</item>
    <item name="spinBars">true</item>
</style>

Agregué esto a mis estilos y no funcionó. También añadido a mi attr.xml

<declare-styleable name="DrawerArrowToggle">
    <!-- The drawing color for the bars -->
    <attr name="color" format="color"/>
    <!-- Whether bars should rotate or not during transition -->
    <attr name="spinBars" format="boolean"/>
    <!-- The total size of the drawable -->
    <attr name="drawableSize" format="dimension"/>
    <!-- The max gap between the bars when they are parallel to each other -->
    <attr name="gapBetweenBars" format="dimension"/>
    <!-- The size of the top and bottom bars when they merge to the middle bar to form an arrow -->
    <attr name="topBottomBarArrowSize" format="dimension"/>
    <!-- The size of the middle bar when top and bottom bars merge into middle bar to form an arrow -->
    <attr name="middleBarArrowSize" format="dimension"/>
    <!-- The size of the bars when they are parallel to each other -->
    <attr name="barSize" format="dimension"/>
    <!-- The thickness (stroke size) for the bar paint -->
    <attr name="thickness" format="dimension"/>
</declare-styleable>

Pero se bloquea y dice error de tipo de color al hacerlo. ¿Qué me estoy perdiendo?

Author: Ivan Bartsov, 2014-10-18

5 answers

Primero, debes saber que ahora el android.support.v4.app.ActionBarDrawerToggle está en desuso.

Debes reemplazar eso por android.support.v7.app.ActionBarDrawerToggle.

Aquí está mi ejemplo y uso el nuevo Toolbar para reemplazar el ActionBar.

MainActivity.java

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
        this,  mDrawerLayout, mToolbar,
        R.string.navigation_drawer_open, R.string.navigation_drawer_close
    );
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerToggle.syncState();
}

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

Puedes leer los documentos en AndroidDocument#DrawerArrowToggle_spinBars

Este atributo es la clave para implementar la animación de menú a flecha.

Int estática pública DrawerArrowToggle_spinBars

Si las barras se deben rotar o no durante la transición
Debe ser un valor booleano "true" o "false".

Por lo tanto, se establece esto: <item name="spinBars">true</item>.

Entonces se puede presentar la animación.

Espero que esto pueda ayudarte.

 240
Author: Yong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-18 07:16:38

Si está utilizando la Biblioteca de soporte proporcionada DrawerLayout como se sugiere en el entrenamiento Creando un cajón de navegación, puede usar el android recién agregado.apoyo.v7 .app.ActionBarDrawerToggle (nota: diferente del ahora obsoleto android.apoyo.v4 .app.ActionBarDrawerToggle):

Muestra un icono de hamburguesa cuando el cajón está cerrado y una flecha cuando el cajón está abierto. Se anima entre estos dos estados como el cajón abrir.

Si bien el entrenamiento no se ha actualizado para tener en cuenta la clase obsoleta/nueva, debería ser capaz de usarlo casi exactamente el mismo código - la única diferencia en su implementación es el constructor.

 25
Author: ianhanniballake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-17 23:43:03

Creé una pequeña aplicación que tenía una funcionalidad similar

MainActivity

public class MyActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                toolbar,
                R.string.open,
                R.string.close
        )

        {
            public void onDrawerClosed(View view)
            {
                super.onDrawerClosed(view);
                invalidateOptionsMenu();
                syncState();
            }

            public void onDrawerOpened(View drawerView)
            {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
                syncState();
            }
        };
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //Set the custom toolbar
        if (toolbar != null){
            setSupportActionBar(toolbar);
        }

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        actionBarDrawerToggle.syncState();
    }
}

Mi XML de esa actividad

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity"
    android:id="@+id/drawer"
    >

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <include layout="@layout/toolbar_custom"/>
    </FrameLayout>
    <!-- The navigation drawer -->
    <ListView
        android:layout_marginTop="?attr/actionBarSize"
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#457C50"/>


</android.support.v4.widget.DrawerLayout>

Mi Barra de herramientas personalizada XML

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/toolbar"
    android:background="?attr/colorPrimaryDark">
    <TextView android:text="U titel"
        android:textAppearance="@android:style/TextAppearance.Theme"
        android:textColor="@android:color/white"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</android.support.v7.widget.Toolbar>

Mi Estilo de Tema

<resources>
    <style name="AppTheme" parent="Base.Theme.AppCompat"/>

    <style name="AppTheme.Base" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primaryDarker</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    </style>

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

    <color name="primary">#457C50</color>
    <color name="primaryDarker">#580C0C</color>
</resources>

Mis estilos en valores-v21

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
        <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
    </style>
</resources>
 17
Author: tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-02 15:24:00

Para responder a la parte actualizada de su pregunta: para estilizar el icono/flecha del cajón, tiene dos opciones:

Estilo de la flecha en sí

Para hacer esto, reemplaza drawerArrowStyle en tu tema de la siguiente manera:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="drawerArrowStyle">@style/MyTheme.DrawerArrowToggle</item>
</style>
<style name="MyTheme.DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="color">@android:color/holo_purple</item>
    <!-- ^ this will make the icon purple -->
</style>

Esto probablemente no es lo que quieres, porque la barra de acción en sí debe tener un estilo consistente con la flecha, por lo que, lo más probable es que quieras la opción dos:

Tema la Barra de acción/Barra de herramientas

Anular el android:actionBarTheme (actionBarTheme para appcompat) atributo del tema de aplicación global con su propio tema (que probablemente debería derivar de ThemeOverlay.Material.ActionBar/ThemeOverlay.AppCompat.ActionBar) de la siguiente manera:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="actionBarTheme">@style/MyTheme.ActionBar</item>
</style>
<style name="MyTheme.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:textColorPrimary">@android:color/white</item>
    <!-- ^ this will make text and arrow white -->
    <!-- you can also override drawerArrowStyle here -->
</style>

Una nota importante aquí es que cuando se utiliza un diseño personalizado con una implementación Toolbar en lugar de stock ActionBar (por ejemplo, si está utilizando el DrawerLayout-NavigationView-Toolbar combo para lograr el efecto de cajón de estilo Material donde es visible bajo barra de estado translúcida), el atributo actionBarTheme obviamente no se recoge automáticamente (porque está destinado a ser cuidado por el AppCompatActivity para el predeterminado ActionBar), así que para tu personalizado Toolbar no olvides aplicar tu tema manualmente:

<!--inside your custom layout with DrawerLayout
and NavigationView or whatever -->
<android.support.v7.widget.Toolbar
        ...
        app:theme="?actionBarTheme">

This esto se resolverá en el valor predeterminado de AppCompat ThemeOverlay.AppCompat.ActionBar o en su override si establece el atributo en su tema derivado.

PS un pequeño comentario sobre la anulación drawerArrowStyle y el atributo spinBars which que muchas fuentes sugieren que se debe establecer en true para obtener la animación del cajón/flecha. La cosa es, spinBars es true por defecto en AppCompat (comprobar fuera del estilo Base.Widget.AppCompat.DrawerArrowToggle.Common), no tiene que reemplazar actionBarTheme en absoluto para que la animación funcione. Obtienes la animación incluso si la sobrescribes y estableces el atributo en false, es solo una animación diferente, menos retorcida. Lo importante aquí es usar ActionBarDrawerToggle, es lo que atrae al elegante dibujable animado.

 9
Author: Ivan Bartsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-28 11:40:47

Quiero corregir un poco el código anterior

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
            this,  mDrawerLayout, mToolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close
        );
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

Y todas las demás cosas permanecerán iguales...

Para aquellos que tienen problemas Drawerlayout barra de herramientas superpuesta

Añadir android:layout_marginTop="?attr/actionBarSize" al diseño raíz del contenido del cajón

 2
Author: Nitin Misra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-12 06:17:22