RecyclerViewの中にあるときに、タッチフィードバックなしでCardViewの謎を誰かが解決しましたか?
たくさんのCardViewを持つRecyclerViewがあります(a CardList)。 CardViewをクリックすると、別のアクティビティが開始されます。これで問題なく動作しますが、CardViewをクリックしてもタッチフィードバックが表示されません。
ちょうど間に合うように、CardView(XML)を次のように構成しました。
Android:clickable="true"
Android:background="?android:selectableItemBackground"
ありがとう!
背景:
CardView
はAndroid:background
を無視してapp:cardBackground
を優先し、色のみにすることができます。境界線と影は実際には背景の一部であるため、独自に設定することはできません。
ソリューション:
カード自体ではなく、CardView
クリック可能なレイアウトを作成します。このレイアウトに必要な両方の属性をすでに記述しています:
Android:clickable="true"
Android:background="?android:selectableItemBackground"
@Eugenが提案したように、CardView
内のレイアウトをクリック可能にすることができるため、Android:background
を使用できます。
<Android.support.v7.widget.CardView
...
Android:clickable="true"
Android:background="?attr/selectableItemBackground">
CardView
内のレイアウトをクリック可能にしてアイテムクリックリスナーを失いたくない場合は、Android:foreground
を使用できます。
<Android.support.v7.widget.CardView
...
Android:clickable="true"
Android:foreground="?attr/selectableItemBackground">
Extra:長方形のマスクが必要ない場合は、"?attr/selectableItemBackgroundBorderless"
の代わりに"?attr/selectableItemBackground"
を使用できます。
foreground
属性を追加:
Android:foreground="?android:attr/selectableItemBackground"
セレクター「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)タッチフィードバックに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のitemView
はtouchイベントに応答しません。子ビューによって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