¿Cómo puedo modificar el color ondulado cuando lo uso?attr / selectableItemBackground como fondo?


He visto algunas preguntas y me dieron algunos métodos posibles para lograr lo que quiero. Por ejemplo:

  1. Utilice el atributo colorControlHighlight en los estilos.XML.

    Aquí están mis estilos-v21.xml:

    <style name="SelectableItemBackground">
        <item name="android:colorControlHighlight">#5677FC</item>
        <item name="android:background">?attr/selectableItemBackground</item>
    </style>
    

    Y mi widget:

    <TextView
        android:id="@+id/tv_take_photo_as_bt"
        android:layout_width="280dp"
        android:layout_height="48dp"
        android:text="@string/act_take_photo"
        style="@style/SelectableItemBackground"/>
    

    Y no funciona. También intenté agregar parent="Theme.AppCompat al estilo "SelectableItemBackground", o cambiar a colorControlHighlight(no android: prefix)", o cambiar a ?android:attr/selectableItemBackground, ninguno de los dos es útil.

  2. Utilice el atributo backgroundTint en el diseño.

    Así que añado android:backgroundTint="#5677FC" a my TextView. Sigue siendo inútil. Entonces traté de cambiar android:backgroundTintMode a src_in y src_atop, y nunca hacen una diferencia.

Entonces, ¿cómo puedo cambiar el color de ondulación cuando uso ?attr/selectableItemBackground como fondo. Solo me concentro en Lollipop y arriba. Gracias de antemano!

Author: ywwynm, 2015-10-11

4 answers

Finalmente encuentro la solución: en lugar de usar android:colorControlHighlight directamente en el tema SelectableItemBackground, debería escribir otro estilo:

<style name="SelectableItemTheme">
    <item name="colorControlHighlight">@color/ripple_color</item>
</style>

Entonces:

<style name="SelectableItemBackground">
    <item name="android:theme">@style/SelectableItemTheme</item>
    <item name="android:background">?attr/selectableItemBackground</item>
</style>

Finalmente agregue style="@style/SelectableItemBackground" a View en la presentación.XML.

ACTUALIZADO EN 2016/8/26 Después del lanzamiento de N, descubrí que a veces no podemos usar este método para establecer el color de ondulación para algún tipo de View(por ejemplo, el CardView). Ahora recomiendo encarecidamente a los desarrolladores que usen RippleDrawable, que también se puede declarar en xml. Aquí está un ejemplo:

Quiero mostrar un efecto dominó cuando el usuario toca/hace clic en un CardView por encima de API21, y por supuesto debería haber otro tipo de retroalimentación antes de Lollipop. Así que debería escribir:

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:foreground="@drawable/selectable_item_background"/>

Y selectable_item_background en la carpeta drawable:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:drawable="@android:color/transparent" />
    <item android:drawable="@color/color_clicked" />
</selector>

selectable_item_background en drawable-v21 carpeta:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ripple_black" />
</selector>

Finalmente, el {[18] {} en[15]}(o drawable-v21) carpeta:

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/color_clicked"
    tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder-->

Eso es todo. Para otras vistas, tal vez deberías usar android:background="@drawable/selectable_item_background". No se olvide de establecer un OnClickListener, OnTouchListener o algo así como esos para ellos, de lo contrario Ripple no se mostrará.

 91
Author: ywwynm,
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
2016-10-08 06:40:49

[7] Harrane y Liuting tienen razón. Respuesta aceptada no es la mejor manera. Permítanme mostrar en el código cómo cambiar el color de ondulación para pre-Lollipop versiones y superiores

  1. Tu AppTheme debe heredar de cualquier tema AppCompat y contener el atributo colorControlHighlight (sin el prefijo' android:')

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
    
  2. Su vista debe contener clickable= " true "y background debe ser"?attr / selectableItemBackgroundBorderless "or"?fondo de carga attr/seleccionable" :

    <LinearLayout
    ...
    android:clickable="true"
    android:background="?attr/selectableItemBackgroundBorderless"/>
    

Nota: si tu vista padre tiene fondo blanco no verás efecto dominó ya que es blanco. Cambiar colorControlHighlight valor para un color diferente

Además, si desea diferentes colores de ondulación en diferentes actividades, puede establecer un tema personal para cada actividad en el archivo de manifiesto, por ejemplo:

       <activity
        android:name="com.myapp.GalleryActivity"
        android:theme="@style/RedRippleTheme"
        />

UPD: ¿Qué pasa si desea diferentes colores de ondulación para diferentes fragmentos en la misma actividad?

Necesitas cambiar atributos del tema de actividad para cada fragmento en tiempo de ejecución. Sólo sobrescribir ellos antes de fragmento se infla con el estilo personalizado y se aplica a un Tema actual:

En valores/estilos.xml

    <style name="colorControlHighlight_blue">
       <item name="colorControlHighlight">@color/main_blue_alpha26</item>
    </style>

Entonces, en tu fragmento antes de la inflación en onCreateView():

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
       View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
       return view;
    }

Este estilo funcionará solo para este fragmento

UPD 2: Por favor corríjame si me equivoco pero parece que el atributo colorControlHighlight no funciona en los diseños si los aplica a una vista:

    <TextView
     ...
     colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK -->

Y solo funciona cuando se establece en un tema

 37
Author: Kirill Karmazin,
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
2016-07-23 12:49:55

La respuesta aceptada es incorrecta.

La forma correcta de usar es lo que Liuting menciona en el comentario. Utilice colorControlHighlight en lugar de android:colorControlHighlight para cambiar el valor predeterminado colorControlHighlight de AppCompat

* Por favor refiérase a http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html en la sección de Tematización *

 5
Author: harrane,
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
2018-02-28 01:57:08

Utilice el atributo foreground como selectableItemBackground y atributo de fondo como el color que desee.

android:foreground="?attr/selectableItemBackground"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:background="@color/white"
 0
Author: Titto Jose,
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
2018-10-05 11:18:55