Wie setze ich den Ripple-Effekt programmgesteuert auf ein LinearLayout?

Lesezeit: 3 Minuten

Benutzeravatar von Splact
Splact

Ich möchte den Hintergrund festlegen android.R.attr.selectableItemBackground zu einem LinearLayout. Bei Verwendung von XML gibt es keine Probleme (es funktioniert)

<LinearLayout
    android:id="@+id/llMiner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true" >

… aber ich muss das in Java-Code machen, also habe ich das versucht

llMiner.setClickable(true);
llMiner.setBackgroundResource(android.R.attr.selectableItemBackground);

… und es funktioniert nicht, tatsächlich bekomme ich a NotFoundException in dieser zweiten Zeile. Nachdem ich diese Variante ausprobiert habe, denke ich, dass die Ressource eine Farbe ist.

llMiner.setClickable(true);
llMiner.setBackgroundColor(android.R.attr.selectableItemBackground);

Dieser startet keine Ausnahme, aber … funktioniert nicht (es gibt keine Änderung des Hintergrunds beim Drücken, aber der Zustand ändert sich, wenn er gedrückt wird, wie es sein muss) … irgendein Vorschlag?

  • ändern Sie die Farbe in der onClick-Methode Ihrer Aktivität..???

    – Usama Sarwar

    5. Januar 2012 um 7:59 Uhr

  • Dann denke ich, dass Sie die onClick-Methode überschreiben müssen, um Ihre Funktionalität zu erledigen.

    – Usama Sarwar

    6. Januar 2012 um 13:17 Uhr

  • Ich versuche es genauso und bisher ohne Erfolg. Wenn Sie eine Lösung gefunden haben, lassen Sie es mich bitte wissen, oder wenn jemand weiß, ob dies tatsächlich möglich ist, geben Sie Feedback. Danke!

    – Sandra

    16. Mai 2012 um 10:28 Uhr

  • Für alle, die nach dem Gegenstück der Support-Bibliothek suchen, ist es genau das Richtige android.support.design.R.attr.selectableItemBackground.

    – Sufian

    2. März 2016 um 13:15 Uhr

  • Mein vorheriger Kommentar scheint jetzt nicht zu funktionieren (oder hat es vielleicht nie getan). Was jetzt funktioniert ist R.attr.selectableItemBackground.

    – Sufian

    2. April 2016 um 7:22 Uhr

Benutzeravatar von Wooseong Kim
Wooseong Kim

Sie können auf diese Weise verwenden.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    // If we're running on Honeycomb or newer, then we can use the Theme's
    // selectableItemBackground to ensure that the View has a pressed state
    TypedValue outValue = new TypedValue();
    this.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
    textView.setBackgroundResource(outValue.resourceId);
}

  • Funktioniert bei mir nicht, weiße Farbe, sie kommen nicht an, um den Farbakzent vom Thema auf dem Pre-Lollipop-Gerät zu halten

    – Anton

    28. August 2015 um 12:19 Uhr

  • Wenn Sie Ihre Themenfarben beibehalten möchten, verwenden Sie R.attr.selectableItemBackground anstelle von android.R.attr.selectableItemBackground

    – Quentin G.

    11. September 2015 um 13:46 Uhr

  • Verwenden R.attr.selectableItemBackground verwendet das Attribut von AppCompat (falls Sie das einschließen) und greift standardmäßig auf das Ein- und Ausblenden anstelle von Ripple für Pre-Lollipop zurück. Beachten Sie, dass R ist dein packagename.R.

    – Sufian

    2. April 2016 um 7:23 Uhr


  • Stimmen Sie für die funktionierende Antwort ab, es hilft wirklich, danke

    – ucMedia

    2. September 2019 um 11:59 Uhr

Verwenden Sie diese hilfreiche Erweiterung

fun Context.makeCircleRippleDrawable(
    @ColorInt rippleColor: Int = ContextCompat.getColor(this, R.color.black_alpha_25),
    @ColorInt backgroundColor: Int = ContextCompat.getColor(this, android.R.color.transparent),
    @ColorInt disabledColor: Int = backgroundColor,
    elevation: Float = 0F
): Drawable {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        val content: GradientDrawable?
        val mask: GradientDrawable?

        if (backgroundColor == Color.TRANSPARENT) {
            content = null
            mask = GradientDrawable()
            mask.setColor(rippleColor)
            mask.shape = GradientDrawable.OVAL
        } else {
            content = GradientDrawable().also {
                it.shape = GradientDrawable.OVAL
                it.color = ColorStateList(
                    arrayOf(
                        intArrayOf(android.R.attr.state_activated),
                        intArrayOf(android.R.attr.state_enabled),
                        intArrayOf(-android.R.attr.state_enabled)
                    ),
                    intArrayOf(
                        backgroundColor,
                        backgroundColor,
                        disabledColor
                    )
                )
            }
            mask = null
        }

        RippleDrawable(
            ColorStateList(
                arrayOf(
                    intArrayOf(android.R.attr.state_pressed),
                    intArrayOf(android.R.attr.state_focused),
                    intArrayOf(android.R.attr.state_activated)
                ),
                intArrayOf(
                    rippleColor,
                    rippleColor,
                    rippleColor
                )
            ),
            content,
            mask
        )
    } else {

        val shapePressed = GradientDrawable()
        shapePressed.shape = GradientDrawable.OVAL
        shapePressed.setColor(rippleColor)

        val shapeDefault = GradientDrawable().also {
            it.shape = GradientDrawable.OVAL
            it.color = ColorStateList(
                arrayOf(
                    intArrayOf(android.R.attr.state_activated),
                    intArrayOf(android.R.attr.state_enabled),
                    intArrayOf(-android.R.attr.state_enabled)
                ),
                intArrayOf(
                    backgroundColor,
                    backgroundColor,
                    disabledColor
                )
            )
        }

        val stateListDrawable = StateListDrawable()
        stateListDrawable.addState(
            intArrayOf(
                android.R.attr.state_pressed,
                android.R.attr.state_enabled
            ), shapePressed
        )
        stateListDrawable.addState(intArrayOf(), shapeDefault)
        stateListDrawable
    }
}

1431750cookie-checkWie setze ich den Ripple-Effekt programmgesteuert auf ein LinearLayout?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy