Stellen Sie in der Android-Ansicht programmgesteuert "? SelectableItemBackground" ein

74

In XML mache ich das oft, um den onClickEffekt zu emulieren :

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

Gibt es eine Möglichkeit, ?selectableItemBackgroundin Java darauf zuzugreifen ?

Hendra Anggrian
quelle

Antworten:

183

Für Appcompat können Sie verwenden,

TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
cardView.setBackgroundResource(outValue.resourceId);
Amit Vaghela
quelle
Ich habe viel gesucht und viele Antworten gefunden, aber dies ist sicherlich die beste. Ich danke dir sehr!
Mattia Ruggiero
funktioniert nicht für mich Ich mache eine Bildansicht programmgesteuert und setze diese Ressource zusammen mit klickbar und fokussierbar wahr
Dr. aNdRO
6
Dadurch wird der Hintergrund und nicht der Vordergrund geändert. Wenn Sie also bereits einen benutzerdefinierten Hintergrund für die Ansicht haben, wird dieser ersetzt. Ich weiß nicht, wie das die richtige Antwort sein kann
Dantalian
1
Kommt als lila. Wie kann man die Farbe ändern?
TheRealChx101
1
das ist hilfreich.
Nouman Ch
38

Für diejenigen, die mit Kotlin arbeiten, gibt es hier einige Erweiterungsfunktionen, mit denen Sie Ripple unter Android View hinzufügen können:

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)
}
Nicolas Duponchel
quelle
1
Mit android.R.attr ... wird die API-Ebene> = 21 unterstützt, wenn R.attr ... verwendet wird, ist es abwärtskompatibel.
Ali Rezaiyan
18

Ich suchte nach der gleichen Lösung. Ich habe diese Antwort leicht geändert , um sie für die gestellte Frage besser geeignet zu machen. Rufen Sie den folgenden Code von Ihrem Konstruktor auf.

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

Sie sollten es als referenzieren

android.R.attr.selectableItemBackground

Vanomart
quelle
-1

Versuchen Sie es mit dem folgenden Code.

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();
Hardik Trivedi
quelle
1
Es tut mir leid, aber dieser Code macht für mich keinen Sinn. Was bringt es, TypedArraywenn Sie keine Ressource daraus erhalten?
Hendra Anggrian
-1

Aus einem Fragment:

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

Von einem Adapter, der in seinem Konstruktor den Kontext oder dasselbe Fragment deklariert:

TypedValue outValue = new TypedValue();
fragment.requireContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
holder.cardView.setBackgroundResource(outValue.resourceId);
Euler Torres Acosta
quelle