¿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:
-
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 acolorControlHighlight(no android: prefix)"
, o cambiar a?android:attr/selectableItemBackground
, ninguno de los dos es útil. -
Utilice el atributo
backgroundTint
en el diseño.Así que añado
android:backgroundTint="#5677FC"
a myTextView
. Sigue siendo inútil. Entonces traté de cambiarandroid:backgroundTintMode
asrc_in
ysrc_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!
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á.
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
-
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>
-
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
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 *
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"
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