studio - salto de linea edittext android
¿Cómo puedo modificar el color de ondulación cuando uso? Attr/selectableItemBackground como fondo? (7)
He visto algunas preguntas SO y me dieron algunos métodos posibles para lograr lo que quiero. Por ejemplo:
-
Utilice el atributo
colorControlHighlight
en styles.xml.Aquí está mi styles-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 estiloparent="Theme.AppCompat
", 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.Entonces agrego
android:backgroundTint="#5677FC"
a miTextView
. Aún inútil. Luego intenté cambiarandroid:backgroundTintMode
asrc_in
ysrc_atop
, y nunca hacen la diferencia.
Entonces, ¿cómo puedo cambiar el color de ondulación cuando uso
?attr/selectableItemBackground
como fondo.
Solo me enfoco en Lollipop y superiores.
¡Gracias de antemano!
Efecto dominó en dispositivos pre y Lollipop +
Harrane y Liuting tienen razón. La respuesta aceptada no es la mejor manera. Permítanme mostrar en el código cómo cambiar el color de ondulación para versiones anteriores a Lollipop y superiores
-
Su AppTheme debe heredar de cualquier tema de 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" (o debe tener un detector de clics configurado mediante programación) y el fondo debe ser "? Attr / selectableItemBackgroundBorderless" o "? Attr / selectableItemBackground":
<LinearLayout ... android:clickable="true" android:background="?attr/selectableItemBackgroundBorderless"/>
Nota: si su vista principal tiene fondo blanco, no verá el efecto dominó ya que es blanco. Cambiar el valor de colorControlHighlight 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"
/>
¿Diferentes colores ondulados para diferentes fragmentos en la misma actividad?
Puede cambiar los atributos del tema de actividad para cada fragmento en tiempo de ejecución. Simplemente sobrescríbalos antes de que el fragmento se infle con su estilo personalizado y aplique a un Tema actual:
en valores / styles.xml
<style name="colorControlHighlight_blue">
<item name="colorControlHighlight">@color/main_blue_alpha26</item>
</style>
Luego, en su 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 solo funcionará para este fragmento
¿Diferentes colores ondulados para diferentes vistas? (Lollipop +)
Puede cambiar el color de ondulación para cada vista por separado utilizando el atributo
colorControlHighlight
,
no funciona
si los aplica directamente a una vista:
<TextView
...
colorControlHighlight="#40ffffff"/> <!-- DOESN''T WORK -->
deberías aplicarlo como tema:
<TextView
...
android:theme="@style/colorControlHighlight_blue"/>
PD: a veces, este enfoque ayuda si tiene problemas desconocidos con la ondulación y no puede resolverlo. En mi caso, utilicé lib deslizante de terceros que estropeó los efectos de onda para todo el diseño y agregué explícitamente este tema a todas las vistas en las que se podía hacer clic.
En la aplicación de tema negro oscuro (o cualquier otra), intente usar como se muestra a continuación primero cree
ripple_effect.xml
en la carpeta
ripple_effect.xml
y agregue código como
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#f5f5f5">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="#f5f5f5" />
</shape>
</item>
</ripple>
luego configure el fondo en su vista Cualquier, como
Linear layout, Button, TextView
etc.
<TextView
android:id="@+id/tvApply"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_effect"
android:clickable="true"
android:text="APPLY"
android:textColor="#FFFFFF"
android:gravity="center"
android:textSize="@dimen/_8sdp"
android:padding="@dimen/_8sdp"
android:focusable="true" />
Este código funciona para mí para crear una onda:
public static void setRippleDrawable(View view, int normalColor, int touchColor) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
RippleDrawable rippleDrawable = new RippleDrawable(ColorStateList.valueOf(touchColor), view.getBackground(), null);
view.setBackground(rippleDrawable);
} else {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{}, new ColorDrawable(normalColor));
view.setBackground(stateListDrawable);
}
} catch (Exception e) {
Log.e(LOG_TAG, "" + e);
}
}
No encontré ninguna forma de modificar el atributo selectableItemBackground. Por eso lo hice como arriba.
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"
para
View
en layout.xml.
ACTUALIZADO EL 26/8/2016
Después del lanzamiento de N, descubrí que a veces no podemos usar este método para configurar el color
CardView
para algún tipo de
View
(por ejemplo, el
CardView
).
Ahora recomiendo a los desarrolladores que usen
RippleDrawable
, que también se puede declarar en xml.
Aquí hay un ejemplo:
Quiero mostrar un efecto
CardView
cuando el usuario toca / hace clic en un
CardView
encima de API21, y, por supuesto, debería haber otro tipo de comentarios antes de Lollipop.
Entonces 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>
drawable-v21
carpeta
drawable-v21
:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ripple_black" />
</selector>
finalmente, el
ripple_black
en la
ripple_black
(o
drawable-v21
):
<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.
Para otras vistas, tal vez debería usar
android:background="@drawable/selectable_item_background"
.
No olvide establecer un
OnClickListener
,
OnTouchListener
o algo así para ellos, de lo contrario no se mostrará la ondulación.
La respuesta aceptada es incorrecta.
La forma correcta de usar es lo que Liuting mencionó en el comentario.
Use
colorControlHighlight
lugar de
android:colorControlHighlight
para cambiar el
colorControlHighlight
predeterminado de
AppCompat
* Consulte http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html en la sección de temas *
Muestra un efecto dominó con color en API +21 y un fondo gris simple en la prensa para API -21. Agrega este estilo:
<style name="AppTheme.MyRipple">
<item name="colorControlHighlight">@color/your_color</item>
<item name="android:background">?selectableItemBackgroundBorderless</item>
</style>
Y configúralo a la vista:
<Button
...
android:theme="@style/AppTheme.MyRipple" />
Use el atributo de primer plano como seleccionableItemBackground y el 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"