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 ?

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

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

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

7

Sie sollten es als referenzieren

android.R.attr.selectableItemBackground


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

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.