java como - ¿Cómo cambiar el color de la flecha hacia atrás en el nuevo tema material?




trucos marker (17)

Actualicé mi SDK a API 21 y ahora el ícono de respaldo / arriba es una flecha negra que apunta hacia la izquierda.

Me gustaría que sea gris. ¿Cómo puedo hacer eso?

En Play Store, por ejemplo, la flecha es blanca.

He hecho esto para establecer algunos estilos. He usado @drawable/abc_ic_ab_back_mtrl_am_alpha para homeAsUpIndicator . Ese dibujo es transparente (solo alfa) pero la flecha se muestra en negro. Me pregunto si puedo configurar el color como lo hago en DrawerArrowStyle . O si la única solución es crear my @drawable/grey_arrow y usarla para homeAsUpIndicator .

<!-- Base application theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light">

    <item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyActionBar</item>
    <item name="actionBarStyle">@style/MyActionBar</item>

    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>

    <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
    <item name="android:homeAsUpIndicator" tools:ignore="NewApi">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
</style>

<!-- ActionBar style -->
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">

    <item name="android:background">@color/actionbar_background</item>
    <!-- Support library compatibility -->
    <item name="background">@color/actionbar_background</item>
</style>

<!-- Style for the navigation drawer icon -->
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@color/actionbar_text</item>
</style>

Mi solución hasta ahora ha sido tomar @drawable/abc_ic_ab_back_mtrl_am_alpha , que parece ser blanco, y pintarlo en el color que deseo usando un editor de fotos. Funciona, aunque preferiría usar @color/actionbar_text como en DrawerArrowStyle .


Answers

Cambiar el color del icono de navegación del menú

En style.xml:

<style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    <item name="android:textColor">@color/colorAccent</item>


</style>

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







In Mainfests.xml :

<activity android:name=".MainActivity"
        android:theme="@style/MyMaterialTheme.Base"></activity>

Use el siguiente método:

private Drawable getColoredArrow() {
    Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

    if (arrowDrawable != null && wrapped != null) {
        // This should avoid tinting all the arrows
        arrowDrawable.mutate();
        DrawableCompat.setTint(wrapped, Color.GRAY);
    }

    return wrapped;
}

Ahora puede configurar el dibujable con:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());

Como se dijo en la mayoría de los comentarios anteriores, la solución es agregar

<item name="colorControlNormal">@color/white</item> al tema de su aplicación. Pero confirme que no tiene otro tema definido en su elemento de la barra de herramientas en su diseño.

     <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

En cuanto a la Toolbar y el origen de TintManager , drawable/abc_ic_ab_back_mtrl_am_alpha está tintado con el valor del atributo de estilo colorControlNormal .

<item name="colorControlNormal">@color/my_awesome_color</item> configurar esto en mi proyecto (con <item name="colorControlNormal">@color/my_awesome_color</item> en mi tema), pero sigue siendo negro para mí.

Actualización :

Lo encontré. Necesita establecer el atributo actionBarTheme ( no actionBarStyle ) con colorControlNormal .

P.ej:

<style name="MyTheme" parent="Theme.AppCompat.Light">        
    <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item>
    <item name="actionBarStyle">@style/MyApp.ActionBar</item>
    <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. -->
    <item name="colorControlNormal">@color/my_awesome_color</item>
    <!-- The animated arrow style -->
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="MyApp.ActionBarTheme" parent="@style/ThemeOverlay.AppCompat.ActionBar">       
    <!-- THIS is where you can color the arrow! -->
    <item name="colorControlNormal">@color/my_awesome_color</item>
</style>

<style name="MyApp.ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="elevation">0dp</item>      
    <!-- style for actionBar title -->  
    <item name="titleTextStyle">@style/ActionBarTitleText</item>
    <!-- style for actionBar subtitle -->  
    <item name="subtitleTextStyle">@style/ActionBarSubtitleText</item>

    <!-- 
    the actionBarTheme doesn't use the colorControlNormal attribute
    <item name="colorControlNormal">@color/my_awesome_color</item>
     -->
</style>

Si desea cambiar el color del botón de flecha para todos los íconos en su tema, solo anule el archivo predeterminado en su carpeta dibujable. El nombre de archivo predeterminado es "abc_ic_ab_back_mtrl_am_alpha.png".


Otra solución que podría funcionar para usted es no declarar su barra de herramientas como la barra de acción de la aplicación (por setActionBar o setSupportActionBar ) y establecer el ícono reverso en su onActivityCreated usando el código mencionado en otra respuesta en esta página

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
toolbar.setNavigationIcon(upArrow);

Ahora, no recibirá la onOptionItemSelected llamada onOptionItemSelected cuando presione el botón Atrás. Sin embargo, puede registrarse para eso usando setNavigationOnClickListener . Esto es lo que hago:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        getActivity().onBackPressed(); //or whatever you used to do on your onOptionItemSelected's android.R.id.home callback
    }
});

No estoy seguro de si funcionará si trabaja con elementos del menú.


si usa la Toolbar , puede intentar esto

Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);

Necesita agregar un solo atributo al tema de su barra de herramientas -

<style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="colorControlNormal">@color/arrow_color</item>
</style>

Aplica esta toolbar_theme a tu barra de herramientas.

O

puedes aplicar directamente a tu tema -

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/arrow_color</item> 
  //your code ....
</style>

La respuesta de Carles es la respuesta correcta, pero pocos de los métodos como getDrawable (), getColor () se desaprobaron en el momento en que escribo esta respuesta . Entonces la respuesta actualizada sería

Drawable upArrow = ContextCompat.getDrawable(context, R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Después de algunas otras consultas de encontré que llamar a ContextCompat.getDrawable () es similar a

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

Y ContextCompat.getColor () es similar a

public static final int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompatApi23.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}

Enlace 1: ContextCompat.getDrawable ()

Enlace 2: ContextCompat.getColor ()


Puedes lograrlo a través del código. Obtenga la flecha hacia atrás dibujable, modifique su color con un filtro y configúrelo como botón Atrás.

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Revisión 1:

A partir de API 23 (Marshmallow), el recurso abc_ic_ab_back_mtrl_am_alpha se cambia a abc_ic_ab_back_material .

EDITAR:

Puede usar este código para lograr los resultados que desea:

toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);

Trató todas las sugerencias anteriores. La única forma en que pude cambiar el color del ícono de navegación La flecha predeterminada del botón Atrás en mi barra de herramientas es establecer colorControlNormal en un tema base como este. Probablemente debido al hecho de que el padre está usando Theme.AppCompat.Light.NoActionBar

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/white</item> 
  //the rest of your codes...
</style>

prueba esto

public void enableActionBarHomeButton(AppCompatActivity appCompatActivity, int colorId){

    final Drawable upArrow = ContextCompat.getDrawable(appCompatActivity, R.drawable.abc_ic_ab_back_material);
    upArrow.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);

    android.support.v7.app.ActionBar mActionBar = appCompatActivity.getSupportActionBar();
    mActionBar.setHomeAsUpIndicator(upArrow);
    mActionBar.setHomeButtonEnabled(true);
    mActionBar.setDisplayHomeAsUpEnabled(true);
}

Llamada de función:

enableActionBarHomeButton(this, R.color.white);

Puede cambiar el color del ícono de navegación programáticamente de esta manera:

mToolbar.setNavigationIcon(getColoredArrow()); 

private Drawable getColoredArrow() {
        Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

        if (arrowDrawable != null && wrapped != null) {
            // This should avoid tinting all the arrows
            arrowDrawable.mutate();
                DrawableCompat.setTintList(wrapped, ColorStateList.valueOf(this.getResources().getColor(R.color.your_color)));
            }
        }

        return wrapped;
}

Solo agrega

<item name="colorControlNormal">@color/white</item> 

a su tema de aplicación actual.


Acabo de cambiar el tema de la barra de herramientas para que sea @ style / ThemeOverlay.AppCompat.Light

y la flecha se volvió gris oscuro

            <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:gravity="center"
            app:layout_collapseMode="pin"
            app:theme="@style/ThemeOverlay.AppCompat.Light">

Nos encontrábamos con el mismo problema y todo lo que queríamos era establecer el

aplicación: collapseIcon

atributo en la barra de herramientas al final, que no encontramos porque no está muy bien documentado :)

<android.support.v7.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/toolbarHeight"
         app:collapseIcon="@drawable/collapseBackIcon" />

Longitud de la cuerda()

String.length() es el número de unidades de código UTF-16 de 16 bits necesarias para representar la cadena. Es decir, es el número de valores char que se utilizan para representar la cadena y, por lo tanto, también es igual a toCharArray().length . Para la mayoría de los caracteres utilizados en los idiomas occidentales, esto suele ser el mismo que el número de caracteres Unicode (puntos de código) en la cadena, pero será menor que las unidades de código numérico si se utiliza algún par suplente UTF-16. Tales pares son necesarios solo para codificar caracteres fuera del BMP y rara vez se usan en la mayoría de los escritos (los emoji son una exception común).

String.getBytes (). Length

String.getBytes().length otro lado, String.getBytes().length Es el número de bytes necesarios para representar tu cadena en la codificación predeterminada de la plataforma. Por ejemplo, si la codificación predeterminada era UTF-16 (rara vez), sería exactamente 2 String.length() el valor devuelto por String.length() (ya que cada unidad de código de 16 bits tarda 2 bytes en representarse). Más comúnmente, la codificación de su plataforma será una codificación de múltiples bytes como UTF-8.

Esto significa que la relación entre esas dos longitudes es más compleja. Para las cadenas ASCII, las dos llamadas casi siempre producirán el mismo resultado (fuera de las codificaciones predeterminadas inusuales que no codifican el subconjunto ASCII en 1 byte). Fuera de las cadenas ASCII, es probable que la String.getBytes().length más larga, ya que cuenta los bytes necesarios para representar la cadena, mientras que la length() cuenta con unidades de código de 2 bytes.

¿Cuál es más adecuado?

Por lo general, usará String.length() en concierto con otros métodos de cadena que toman las compensaciones en la cadena. Por ejemplo, para obtener el último carácter, str.charAt(str.length()-1) . Solo usaría la getBytes().length Si, por alguna razón, estuviera tratando con la codificación de matriz de bytes devuelta por getBytes .







java android user-interface colors android-styles