Que nadie ha resuelto el misterio de la CardView sin retroalimentación táctil cuando está dentro de una RecyclerView?

Tengo un RecyclerView con un montón de CardViews (un CardList). Cuando hago clic en cualquier CardView, empiezo a otra Actividad. Que está funcionando bastante bien, pero yo no puedo ver ninguna retroalimentación táctil cuando hago clic en el CardView.

Justo a tiempo, ya he configurado mi CardView (XML) con estos:

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

Gracias!

5 Comentarios

  1. 37

    De fondo:

    La CardView ignora android:background en favor de app:cardBackground que sólo puede ser de color. La frontera y la sombra son de hecho parte del fondo de modo que usted puede establecer su propio.

    Solución:

    Hacer el diseño en el interior de la CardView puede hacer clic en lugar de la propia tarjeta. Ya escribió ambos atributos que se necesitan para este diseño:

    android:clickable="true"
    android:background="?android:selectableItemBackground"
    • Ya esta probado uno. No funciona tampoco.
    • Hey! Lo siento! Estás en lo correcto. Lo que era infiel a mí es que estoy usando el Tema.Tema Material, y es un «oscuro» es el tema. Desde que me he cambiado de Tema.Material.La luz, y utiliza su respuesta, la retroalimentación táctil se llevó a cabo.
    • Esto funciona bien en Lollipop y por encima. En Kit Kat el fondo del interior de la vista no cubre la totalidad de la cardView (aquí es donde te das cuenta de que las sombras son falsos en Kit Kat). Está bien, pero no perfecto. Puedo vivir con eso por ahora.
    • Sí, creo que he tenido el mismo problema. No recuerdo cómo lo resolví, pero la configuración de contentPadding en la tarjeta a la misma valor como negativo cardCornerRadius (para ser precisos el valor de la raíz de la que creo) debería hacer la mitad del trabajo (asegúrese de establecer useCompatPadding a true). La segunda mitad es la creación de un fondo personalizado <shape> de ESTADO! dibujable con la misma esquina de tamaño. El tercer medio es la definición de un objeto dibujable-v21 que utiliza ondas en su lugar. Voy a tratar de actualización de la respuesta con una muestra más adelante.
    • Usted salvó mi día, gracias!
    • android:foreground="?android:selectableItemBackground" en CardView fue una solución de limpieza para mí, ya que realizar el diseño interior de CardView clickable fue la desactivación de mi el elemento, haga clic en el oyente

  2. 7

    Solución 1

    Como @Eugen propuesto, puede hacer que el diseño interior CardView puede hacer clic, entonces usted puede utilizar android:background:

    <android.support.v7.widget.CardView
        ...
        android:clickable="true"
        android:background="?attr/selectableItemBackground">

    Solución 2

    Si usted no quiere perder el elemento, haga clic en el oyente por realizar el diseño interior de CardView puede hacer clic, usted puede utilizar android:foreground:

    <android.support.v7.widget.CardView
        ...
        android:clickable="true"
        android:foreground="?attr/selectableItemBackground">

    Extra: puede utilizar "?attr/selectableItemBackgroundBorderless" en lugar de "?attr/selectableItemBackground" si usted no desea que el rectángulo de la máscara.

    • primer plano de la CardView es la única solución que trabajó conmigo. Gracias.
    • Este ejemplo de código es confuso – no hay ninguna disposición en el CardView. ¿Cuál es el punto de fronteras selector si ya recortadas con forma de tarjeta? Se ve la misma.
  3. 1

    crear selector «dibujable/card_foreground_selector»

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
            <shape android:shape="rectangle">
                <solid android:color="#18000000"/>
                <corners android:radius="@dimen/card_radius" />
            </shape>
        </item>
        <item android:state_focused="true" android:state_enabled="true">
            <shape android:shape="rectangle">
                <solid android:color="#0f000000"/>
                <corners android:radius="@dimen/card_radius" />
            </shape>
        </item>
    </selector>

    y crear «drawable/card_foreground.xml» (deberá ajustar los valores de margen de acuerdo a la altura de su tarjeta de)

    <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/card_foreground_selector"
    android:insetLeft="2dp"
    android:insetRight="2dp"
    android:insetTop="3dp"
    android:insetBottom="3dp"/>

    modificar el artículo (item.xml)

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:contentPadding="8dp"
        android:foreground="@drawable/card_foreground">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        //..
    
        </LinearLayout>
    </android.support.v7.widget.CardView>

    puede ver post original aquí

    • En lugar de crear una nueva imagen que sólo utiliza android:foreground="?android:selectableItemBackground"
    • Que es «?selectableItemBackground» para AppCompat. Funciona en todas las plataformas? La costumbre de dibujable se utiliza antes de Lollipop porque las esquinas ?selectableItemBackground no se recorta.
    • tienes razón, no me di cuenta de las esquinas no están recortadas antes de Lollipop, puede ser una buena opción si la tarjeta de vista no tiene radio de la esquina.
  4. 1

    Tanto el Enfoque debería funcionar de la misma manera.

    1) Si desea cardview para responder a la retroalimentación táctil, a continuación, utilizar esta uno en cardview.

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

    pero si el método anterior no funciona, puede establecer esta propiedad en niño vista de grupo (Lineal/Familiar, etc), de cardview.

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

    Pero luego itemView de ViewHolder no responder a la toque evento. desde su estado consumido por niño así que usted tiene que conjunto clicklistener en childview trabajar más con el oyente en recyclerview adaptador, de esta manera podemos permitir touch, así como en eventos de clic en la fila de elementos de recyclerview en nuestro adaptador.

    si usted tiene dificultades para seguir el contacto y haga clic en vistas en cardview con ondulación entonces esto podría ser útil. Retroalimentación Táctil Problema

    2.) El segundo enfoque es el uso de la forma tradicional de uso de toque personalizado selector de imagen y establecer como fondo.

        <?xml version="1.0" encoding="utf-8"?>
    <ripple
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="your ripple color">
        <item>
        <selector>
            <item android:state_selected="true">
                <color android:color="your selected color" />
            </item>
            <item android:state_activated="true">
                <color android:color="your selected color" />
            </item>
            <item>
                <color android:color="your normal color" />
            </item>
        </selector>
        </item>
    </ripple>

    Docs Ondulación Dibujable

Dejar respuesta

Please enter your comment!
Please enter your name here