Estoy tratando de conseguir un CardView para mostrar el efecto de la ondulación cuando es tocado por la configuración de android:fondo de atributo en la actividad de archivo XML como se describe aquí en el que los Desarrolladores de Android de la página, pero no está funcionando. No hay ninguna animación en todo, pero el método onClick se llama. También he intentado crear un ripple.xml archivo de como se sugiere aquí, pero con el mismo resultado.

La CardView como aparece en la actividad del archivo XML:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="155dp"
    android:layout_height="230dp"
    android:elevation="4dp"
    android:translationZ="5dp"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:onClick="showNotices"
    android:background="?android:attr/selectableItemBackground"
    android:id="@+id/notices_card"
    card_view:cardCornerRadius="2dp">

</android.support.v7.widget.CardView> 

Soy relativamente nueva en el desarrollo de android, por lo que podría haber cometido un par de errores evidentes.

Gracias de antemano.

13 Comentarios

  1. 498

    Debe añadir lo siguiente a CardView:

    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true"
    • Funciona en lollipop con efecto dominó pero que sólo da color sólido cuando se ejecuta en las plataformas anteriores. Lo suficientemente bueno para mí 🙂
    • si se añade a CardView funciona a la perfección incluso en anteriores versiones de android (tal vez las bibliotecas de soporte se actualizan?)
    • Una pequeña observación: he notado que el puede hacer clic atributo no es necesario e incluso puede romper algunas cosas! Yo tenía un GridView llena con los enlaces de CardViews y el oyente no estaba funcionando correctamente. He quitado el clickable etiqueta desde el XML y ahora todo funciona a la perfección
    • sin hacer clic, hace que el que la ondulación que se originan en el centro, sólo
    • Puede usted dar alguna explicación, como dijo @sashoalm donde colocar este código?
    • ?android:attr/selectableItemBackground requiere de la API de nivel 11
    • acaban de salir las dos líneas en el xml de tu CardView archivo.
    • Este debe ser aceptado por respuesta.
    • ¿Por qué no la ondulación empezar desde el punto de toque & empiezan desde el centro.
    • No del todo ciertas. Sólo una observación que he hecho en mis pruebas.
    • No debería ser realmente un sistema en el cual los usuarios pueden reemplazar el aceptado respuesta.
    • Esto debe ser aceptado como respuesta.
    • Gu Sólo por curiosidad, cómo retrasar (acciones de la interfaz de usuario similar a los diálogos que se esconde efecto dominó detrás de él) interfaz de usuario de diálogos, por lo que el efecto dominó se muestra? No quiero usar controlador.
    • Creo que puedes encontrar lo que quieras aquí: stackoverflow.com/questions/30201422/…
    • en la api de 17 si usted pulsa en él no tiene ningún efecto, sólo funciona si usted hace su toque de poco más larga de prensa.
    • Trabajando sin android:clickable="true".
    • Si usted tiene RelativeLayout o LinearLayout etc. como el hijo único, hacen clickable="false" por lo que va a pasar el evento click para el CardView debajo de ella
    • para CardView mejor uso?attr/selectableItemBackgroundBorderless
    • Funciona a la perfección ! Gracias ! @JadenGu
    • He encontrado que si usted presione el cardView muy rápidamente, a continuación, usted incluso no ver ninguna ondulación de animación; la ondulación de la animación parece requerir un 1sec eventos de toque para ver nada. Parece que tengo que añadir postDelayed() llamada a ejecutar mi haga clic en evento de acción después de 1 segundo y la fuerza de la animación para mostrar que 1 seg !

  2. 26

    Añadir estas dos líneas de código en la vista xml para dar efecto dominó en su cardView.

    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    • Impresionante! foreground trabaja con fondo personalizado vistas como un encanto! Bueno!
  3. 23

    Me las arreglé para conseguir el efecto dominó en el cardview por :

    <android.support.v7.widget.CardView 
        xmlns:card_view="http://schemas.android.com/apk/res-auto" 
        android:clickable="true" 
        android:foreground="@drawable/custom_bg"/>

    y para el custom_bg que se puede ver en el código anterior, hemos de definir un archivo xml para ambos lollipop(en dibujable-v21 paquete) y pre-lollipop(en dibujable paquete) de los dispositivos.
    para custom_bg en dibujable-v21 paquete el código es:

    <ripple 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
    <item
        android:id="@android:id/mask"
        android:drawable="@android:color/white"/>
    </ripple>

    para custom_bg en la imagen del paquete, y el código es:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/colorHighlight"></solid>
        </shape>
    </item>
    <item>
        <shape>
            <solid android:color="@color/navigation_drawer_background"></solid>
        </shape>
    </item>
    </selector>

    así que en la pre-lollipop dispositivos tendrá un sólido haga clic en el efecto y en lollipop dispositivos tendrá un efecto dominó en el cardview.

    • Hola, me doy cuenta de que mediante la aplicación de un selector (o rizado) en CardView del primer plano, se bloquearán los niños en CardView sí – stackoverflow.com/questions/33763403/… se Puede saber qué te encontrarás con el mismo problema, como yo lo hice? O, ¿ se me olvida algo? Gracias.
    • Yo no soy de hacer frente a cualquier problema como tu, pero yo diría que a partir de la experiencia personal que cardView tiene algunos errores de pre-lollipop. Evite el uso de cardview:elevación de la propiedad en pre-lollipop. Lo anterior funciona muy bien para mí y otros upvotes.
    • Se puede saber, ¿cuál es el valor de su colorHighlight & navigation_drawer_background. Si usted utiliza su propio color definido, sin transparencia, se puede ver su tarjeta de niños?
    • los valores son como el, <nombre del color=»navigation_drawer_background»>#FFFFFF</color> <nombre del color=»colorHighlight»>#FF8A65</color>
    • Yo no trabajo para mi caso. Puedo usar su selector como primer plano. Como era de esperar, sólido de color blanco (navigation_drawer_background), que se utiliza como tarjeta de vista de primer plano de la voluntad de bloquear la visibilidad de todos los niños – i.imgur.com/CleYh5B.png Esta es la forma en que mira como sin aplicar selector en primer plano – i.imgur.com/ZXk5Aoq.png
    • u hizo crear el paquete de derecho? Como se explicó anteriormente.. @CheokYanCheng
    • usted tiene. programar la altura de la vista carta y establecer mlatch_parent dentro de

  4. 14

    El efecto dominó que fue omitido en la appcompat apoyo de la biblioteca, que es lo que se está utilizando. Si quieres ver la ondulación utilizar el Android L versión y probarla en un dispositivo con Android L dispositivo. Por el AppCompat v7 sitio:

    «¿Por qué no hay ondas en pre-Lollipop?
    Mucho de lo que permite RippleDrawable para ejecutar sin problemas es Android 5.0 nuevo RenderThread. Para optimizar el rendimiento en las versiones anteriores de Android, hemos dejado RippleDrawable fuera por ahora.»

    Echa un vistazo a este enlace aquí para obtener más información

    • Eso sería todo. Gracias!
    • Pero, ¿cómo poner al efecto dominó en cardView para Android Lollipop entonces?
    • Así que tengo que decidir entre la compatibilidad hacia atrás usando appcompat o tener todos los nuevos efectos, el uso de clases de android núcleo, pero limitándome a la API de 21?
    • Usted podría hacer 2 APK uno para 21+ y el otro por el < 21. O dividir el código desde el 21+ no va a utilizar supportActionbar etc. Puede sonar como un montón de problemas, pero esa es su sollution creo.
    • Esta es la razón por la escritura «pura» de Android L aplicaciones no es viable por el momento. A partir de julio de 2015 va a ser dirigido el 12% de los usuario de Android de la base.
  5. 8

    Si la aplicación minSdkVersion el que se trabaja, es el nivel 9, se puede utilizar:

    android:foreground="?selectableItemBackground"
    android:clickable="true"

    Lugar, a partir de nivel 11, se utiliza:

    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true"

    De documentación:

    puede hacer clic – Define si este punto de vista reacciona a los eventos de clic. Debe ser un valor booleano «true» o «false».

    primer plano – Define la imagen para dibujar sobre el contenido. Esto puede ser usado como una superposición. El primer plano dibujable participa en el relleno de los contenidos si la gravedad se establece para llenar.

  6. 4

    Para mí, la adición de la foreground a CardView no funcionó (razón desconocida :/)

    Agregando que el mismo es hijo de diseño hizo el truco.

    CÓDIGO:

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:focusable="true"
        android:clickable="true"
        card_view:cardCornerRadius="@dimen/card_corner_radius"
        card_view:cardUseCompatPadding="true">
    
        <LinearLayout
            android:id="@+id/card_item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:foreground="?android:attr/selectableItemBackground"
            android:padding="@dimen/card_padding">
    
        </LinearLayout>
    </android.support.v7.widget.CardView>
    • Eso es porque el niño intercepta el evento, si intenta algo como la adición de relleno para el cardview (algo así como 20dp), y haga clic en la parte donde el relleno sería, entonces usted verá el efecto de la ondulación incluso sin que el niño tenga el primer plano de conjunto de atributos
    • Esto funcionó para mí también, utilizando el nuevo Material de los Componentes de la: com.google.android.material.de la tarjeta.MaterialCardView. Yo tenía una elevación stateListAnimator para la vista de la tarjeta para ajustar la elevación y ondulación aplicado al interior de la restricción de diseño con posibilidad de seleccionar el elemento de fondo en primer plano sin hacer clic atributo.
    • Yo no lo recuerdo ahora, pero hay una manera de configurar el niño vistas a no reaccionar ante el evento click
  7. 2

    Si hay una raíz diseño como RelativeLayout o LinearLayout que contienen todos los elemento del adaptador del componente en CardView, tendrá que establecer el atributo background en diseño raíz. como:

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="122dp"
    android:layout_marginBottom="6dp"
    android:layout_marginLeft="6dp"
    android:layout_marginRight="6dp"
    card_view:cardCornerRadius="4dp">
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/touch_bg"/>
    </android.support.v7.widget.CardView>
  8. 2

    Agregar estos dos como de código de trabajo como un encanto para cualquier vista como el Botón, Linear o CardView a poner estas dos líneas y ver la magia…

    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true"
  9. 2

    Ondulación evento para android Cardview de control:

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:foreground="?android:attr/selectableItemBackground"
        android:clickable="true"
        android:layout_marginBottom="4dp"
        android:layout_marginTop="4dp" />
  10. 1

    Yo no era feliz con AppCompat, así que escribí mi propia CardView y puestos ondas. Aquí se está ejecutando en el Galaxy S con Gingerbread, por lo que es definitivamente posible.

    Efecto dominó en Android Lollipop CardView

    Para más detalles revisa la código fuente.

    • el enlace está roto
    • fijo, ahora debe llevar a la página correcta
  11. 0

    Para aquellos que buscan una solución a la cuestión del efecto de la ondulación no trabajando en una programación creado CardView (o en mi caso, la costumbre de vista que se extiende CardView) que se muestra en un RecyclerView, los siguientes trabajó para mí. Básicamente declarar los atributos XML mencionado en las otras respuestas de manera declarativa en el fichero XML de diseño no parece funcionar para crear mediante programación CardView, o uno creado a partir de un diseño personalizado (incluso si la raíz de vista es CardView o combinación de elemento se utiliza), así que tienen que ser establecido mediante programación como:

    private class MadeUpCardViewHolder extends RecyclerView.ViewHolder {
        private MadeUpCardView cardView;
    
        public MadeUpCardViewHolder(View v){
            super(v);
    
            this.cardView = (MadeUpCardView)v;
    
            //Declaring in XML Layout doesn't seem to work in RecyclerViews
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                int[] attrs = new int[]{R.attr.selectableItemBackground};
                TypedArray typedArray = context.obtainStyledAttributes(attrs);
                int selectableItemBackground = typedArray.getResourceId(0, 0);
                typedArray.recycle();
    
                this.cardView.setForeground(context.getDrawable(selectableItemBackground));
                this.cardView.setClickable(true);
            }
        }
    }

    Donde MadeupCardView extends CardView Felicitaciones a esta respuesta para la TypedArray parte.

  12. 0
      android:foreground="?android:attr/selectableItemBackgroundBorderless"
       android:clickable="true"
       android:focusable="true"

    Sólo de trabajo de la api 21 y el uso de esta no utilice esta lista de fila de vista de la tarjeta de

  13. 0

    Agregar lo siguiente a tu xml:

    android:clickable="true"
    android:focusable="true"
    android:background="?android:attr/selectableItemBackground"

    Y agregar a su adaptador (si es tu caso)

        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val attrs = intArrayOf(R.attr.selectableItemBackground)
                val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
                val selectableItemBackground = typedArray.getResourceId(0, 0)
                typedArray.recycle()
    
                holder.itemView.isClickable = true
                holder.itemView.isFocusable = true
                holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
            }
        }

Dejar respuesta

Please enter your comment!
Please enter your name here