web-dev-qa-db-ja.com

Android Lollipop CardViewへの波及効果

私はCardViewにAndroid XMLを設定することで触れた時の波及効果を表示させようとしています。アクティビティXMLファイルでbackgound属性を ここ で記述Android Developersページですが、うまくいきません。アニメーションはまったくありませんが、onClickのメソッドが呼び出されます。ここで提案されているとおり ripple.xmlファイルを作成してみました が、同じ結果になりました。

アクティビティのXMLファイルに表示されるCardView。

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

私は比較的Androidの開発に慣れていないので、私はいくつかの明らかな間違いを犯したかもしれません。
前もって感謝します。

147
AkraticCritic

CardViewに以下を追加してください。

Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
479
Jaden Gu

これら2行のコードをxmlビューに追加して、cardViewに波及効果を与えてください。

Android:clickable="true"
Android:foreground="?android:attr/selectableItemBackground"
26
Abdul Rizwan

私はどうにかしてcardviewに波及効果を得ることができました:

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

また、上記のコードに表示されるcustom_bgには、Lollipop(drawable-v21パッケージ内)とpre-Lollipop(drawableパッケージ内)の両方のデバイス用のxmlファイルを定義する必要があります。 drawable-v21パッケージのcustom_bgの場合、コードは次のとおりです。

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

drawableパッケージのcustom_bgの場合、コードは次のとおりです。

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

そのため、Lollipopより前のデバイスではしっかりとしたクリック効果があり、LollipopデバイスではCardviewに波及効果があります。

23
Rahul Ahuja

Appcompatサポートライブラリで波及効果が省略されています。波紋を確認したい場合は、Android Lバージョンを使用してAndroid Lデバイスでテストしてください。 AppCompat v7サイトあたり:

「ロリポップ以前に波紋がないのはなぜですか?RippleDrawableを円滑に実行するための多くの要素は、Android 5.0の新しいRenderThreadです。以前のバージョンのAndroidでパフォーマンスを最適化するために、RippleDrawableは今のところ残しています。

詳しくはこちらのリンク をご覧ください

14
Developer Paul

使用しているアプリminSdkVersionがレベル9の場合は、次のものを使用できます。

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

代わりに、レベル11から始めて、あなたは使用します:

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

ドキュメントから:

clickable - このビューがクリックイベントに反応するかどうかを定義します。 「true」または「false」のブール値でなければなりません。

foreground - コンテンツを描画するためのドロウアブルを定義します。これはオーバーレイとして使用できます。重力が塗りつぶしに設定されている場合、前景のドロアブルはコンテンツのパディングに参加します。

私にとっては、foregroundCardViewに追加してもうまくいきませんでした(理由不明:/)

その子レイアウトに同じものを追加すると、うまくいきました。

コード:

<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>
4
Prabs

RelativeLayoutやLinearLayoutのようにCardViewのすべてのアダプタ項目のコンポーネントを含むルートレイアウトがある場合は、そのルートレイアウトにbackground属性を設定する必要があります。好きです:

<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>
2
Robert Lee

リップル AndroidのCardviewコントロールのイベント:

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

私はAppCompatに満足していなかったので、私は私自身のCardViewを書き、さざ波をバックポートしました。これはGingerbreadを搭載したGalaxy S上で実行されているので、間違いなく可能です。

Demo of Ripple on Galaxy S

詳しくは ソースコード をチェックしてください。

1
Zielony

Button、Linear Layout、またはCardViewのような任意のビューに対して、これら2つのコードを魅力的なように組み合わせて追加するだけで、これら2行を追加して魔法を見ることができます。

Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
1
Hitesh Kushwah

RecyclerViewに表示されているプログラムで作成されたCardView(または私の場合はCardViewを拡張するカスタムビュー)で波紋効果が機能しないという問題の解決策を探している人には、以下が役に立ちました。 XMLレイアウトファイルで宣言的に他の回答に記載されているXML属性を基本的に宣言することは、プログラムで作成されたCardView、またはカスタムレイアウトから作成されたCardViewでは機能しないようです。それらはプログラム的に次のように設定する必要があります。

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);
        }
    }
}

ここでMadeupCardView extends CardViewは、TypedArrayの部分のために この答え と称します。

0
Breeno
  Android:foreground="?android:attr/selectableItemBackgroundBorderless"
   Android:clickable="true"
   Android:focusable="true"

Api 21のみを使用してこれを使用すると、このリストの行カードビューは使用されません

0
Tarun Umath

Xmlに以下を追加してください。

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

そして、あなたのアダプタに追加してください(それがあなたのケースなら)

    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)
        }
    }
0
Mateus Melo