Pertanyaan RecyclerView + CardView + Sentuh umpan balik


Ada yang sudah memecahkan misteri CardView tanpa umpan balik sentuhan saat berada di dalam RecyclerView?

Saya memiliki RecyclerView dengan sekelompok CardViews (a CardList). Ketika saya mengklik CardView apa saja, saya memulai Aktivitas lain. Itu bekerja cukup baik, tetapi saya tidak bisa melihat umpan balik sentuhan ketika saya mengklik CardView.

Tepat pada waktunya, saya sudah mengkonfigurasi CardView (XML) saya dengan ini:

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

Terima kasih!


18
2018-01-04 00:06


asal


Jawaban:


Latar Belakang:

Itu CardView mengabaikan android:background mendukung app:cardBackground yang hanya bisa berwarna. Perbatasan dan bayangan sebenarnya bagian dari latar belakang sehingga Anda tidak dapat mengatur sendiri.

Larutan:

Buat tata letak di dalam CardView dapat diklik dan bukan kartu itu sendiri. Anda sudah menulis kedua atribut yang diperlukan untuk tata letak ini:

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

34
2018-01-04 00:14



Solusi 1

Saat @Eugen mengusulkan, Anda dapat membuat tata letak di dalamnya CardView dapat diklik, sehingga Anda dapat menggunakannya android:background:

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

Solusi 2

Jika Anda tidak ingin kehilangan pendengar klik item dengan membuat tata letak di dalamnya CardView dapat diklik, dapat Anda gunakan android:foreground:

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

Tambahan: Kamu dapat memakai "?attr/selectableItemBackgroundBorderless" dari pada "?attr/selectableItemBackground" jika Anda tidak ingin topeng persegi panjang.


4
2017-11-28 18:04



buat selector "drawable / 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>

dan buat "drawable / card_foreground.xml" (Anda perlu men-tweak nilai inset sesuai dengan ketinggian kartu Anda)

<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"/>

modifikasi item Anda (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>

Anda dapat melihat posting asli sini


1
2017-08-05 04:06



Menambahkan foreground atribut:

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

1
2017-12-15 13:58



Kedua Pendekatan harus bekerja dengan cara yang sama.

1)  Jika Anda ingin tampilan kartu merespons umpan balik sentuh, gunakan yang ini di tampilan kartu.

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

tetapi jika pendekatan di atas tidak berfungsi maka Anda dapat menyetel properti ini anak lihat grup (Linear / Relatif dll) dari tampilan kartu.

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

Tapi kemudian itemView ViewHolder tidak akan merespons menyentuh peristiwa. sejak sudah dikonsumsi oleh tampilan anak jadi Anda harus set  clicklistener di childview untuk bekerja lebih jauh dengan pendengar di adaptor recyclerview, cara ini kita dapat mengaktifkan sentuhan serta klik peristiwa pada item baris recyclerview di adaptor kami.

jika Anda memiliki waktu yang sulit mengikuti sentuhan dan klik pada tampilan di cardview dengan riak maka ini mungkin bisa membantu. Sentuh Masalah Umpan Balik

2.) Pendekatan kedua adalah menggunakan cara tradisional menggunakan pemilih sentuh kustom yang dapat digambar dan ditetapkan sebagai latar belakang.

    <?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>

Dokumen Ripple Drawable


1
2018-04-27 12:00