web-dev-qa-db-ja.com

RecyclerView + CardView +タッチフィードバック

RecyclerViewの中にあるときに、タッチフィードバックなしでCardViewの謎を誰かが解決しましたか?

たくさんのCardViewを持つRecyclerViewがあります(a CardList)。 CardViewをクリックすると、別のアクティビティが開始されます。これで問題なく動作しますが、CardViewをクリックしてもタッチフィードバックが表示されません。

ちょうど間に合うように、CardView(XML)を次のように構成しました。

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

ありがとう!

23

背景:

CardViewAndroid:backgroundを無視してapp:cardBackgroundを優先し、色のみにすることができます。境界線と影は実際には背景の一部であるため、独自に設定することはできません。

ソリューション:

カード自体ではなく、CardViewクリック可能なレイアウトを作成します。このレイアウトに必要な両方の属性をすでに記述しています:

Android:clickable="true"
Android:background="?android:selectableItemBackground"
39
Eugen Pechanec

解決策1

@Eugenが提案したように、CardView内のレイアウトをクリック可能にすることができるため、Android:backgroundを使用できます。

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

解決策2

CardView内のレイアウトをクリック可能にしてアイテムクリックリスナーを失いたくない場合は、Android:foregroundを使用できます。

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

Extra:長方形のマスクが必要ない場合は、"?attr/selectableItemBackgroundBorderless"の代わりに"?attr/selectableItemBackground"を使用できます。

8
David Miguel

foreground属性を追加:

Android:foreground="?android:attr/selectableItemBackground"
1
Volodymyr Kulyk

セレクター「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>

そして、「drawable/card_foreground.xml」を作成します(カードの高さに応じてインセット値を微調整する必要があります

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

アイテムを変更する(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>

元の投稿を表示できます ここ

1
Gilang

どちらのアプローチも同じように機能するはずです。

1)タッチフィードバックにcardviewを応答させたい場合は、cardview

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

上記のアプローチが機能しない場合は、このプロパティをchildビューグループ(線形/ cardviewの相対など)。

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

ただし、ViewHolderのitemViewtouchイベントに応答しません。子ビューによってconsumedとなっているので、子ビューのsetclicklistenerは、recyclerviewアダプタのリスナーでさらに動作します。これにより、タッチだけでなく、アダプターのrecyclerviewの行アイテムのイベントをクリックします。

タッチをたどり、リップルのあるカードビューのビューをクリックするのに苦労している場合は、これが役立つことがあります。 タッチフィードバックの問題

2。)2番目のアプローチは、カスタムタッチセレクタードローアブルとセットを使用する従来の方法を使用することです背景として。

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

ドキュメント Ripple Drawable

1
vikas kumar