113 votes

Définir par programmation '?selectableItemBackground " sur l'Android vue

En xml, je fais souvent ce à émuler onClick effet:

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?selectableItemBackground">

    ...

</android.support.v7.widget.CardView>

Est-il possible d'accéder ?selectableItemBackground en java?

238voto

Amit Vaghela Points 5612

Pour appcompat vous pouvez utiliser,

TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
cardView.setBackgroundResource(outValue.resourceId);

62voto

Hy là ! Pour ceux comment travailler avec Kotlin, voici quelques extensions de fonctions pour ajouter Ondulation sur Android type d'Affichage :

private fun View.addRipple() = with(TypedValue()) {
    context.theme.resolveAttribute(android.R.attr.selectableItemBackground, this, true)
    setBackgroundResource(resourceId)
}

private fun View.addCircleRipple() = with(TypedValue()) {
    context.theme.resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, this, true)
    setBackgroundResource(resourceId)
}

27voto

Wirling Points 899

Je cherchais la même solution. J'ai légèrement modifié cette réponse pour le rendre plus adapté à la question posée. Appeler le code suivant à partir de votre constructeur.

private void setClickableAnimation(Context context)
{
    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute( 
        android.R.attr.selectableItemBackground, outValue, true);        
    setForeground(getDrawable(context, outValue.resourceId));
}

7voto

vanomart Points 170

Vous devez le référencer comme

android.R.attr.selectableItemBackground

-1voto

Hardik Trivedi Points 3491

Essayez de code ci-dessous.

int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
cardView.setBackgroundResource(backgroundResource);
cardView.setClickable(true);
typedArray.recycle();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X