在Android视图上以编程方式设置“?selectableItemBackground”


80

在xml中,我经常这样做以模拟onClick效果:

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

有什么办法可以?selectableItemBackground在Java中访问吗?

Answers:


192

对于appcompat,您可以使用,

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

我一直在搜索很多东西,也找到了很多答案,但这当然是最好的答案。非常感谢!
Mattia Ruggiero

不适合我工作我以编程方式制作“图像视图”并设置此资源以及可单击和可聚焦的true
aNdRO博士19年

7
这会更改背景,而不是前景,因此,如果您已经拥有视图的自定义背景,它将替换它。我不知道这怎么可能是正确的答案
Dantalian

1
呈紫色。有什么方法可以改变颜色?
TheRealChx101 '19

1
这很有帮助。
Nouman Ch

42

对于使用Kotlin的用户,以下是一些扩展功能,可在Android View类型上添加Ripple:

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
使用android.R.attr ...将支持API级别> = 21,如果使用R.attr ...则将向后兼容。
Ali Rezaiyan

当我单击卡片视图时,它消失了!
凯萨尔·汗·邦加什

19

我一直在寻找相同的解决方案。我对这个答案做了些微修改,使其更适合提出的问题。从构造函数中调用以下代码。

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

8

您应该将其引用为

android.R.attr.selectableItemBackground


0

基于@Wirling答案,我们可以使用前景来设置颜色和波纹效果

注意:前景需要android API级别23(M)及以上:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
    view.setForeground(getDrawable(getContext(), outValue.resourceId));
}

-1

尝试下面的代码。

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
很抱歉,但是这段代码对我来说没有意义,TypedArray如果您没有从中获取任何资源,那又有什么意义呢?
亨德拉·安格里安

-1

从片段:

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

从适配器在其构造函数中声明上下文或相同片段:

TypedValue outValue = new TypedValue();
fragment.requireContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
holder.cardView.setBackgroundResource(outValue.resourceId);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.