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

时间:2016-06-23 09:35:49

标签: android xml android-layout android-cardview

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

有没有办法在java中访问?selectableItemBackground

8 个答案:

答案 0 :(得分:100)

对于 appcompat ,您可以使用

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

答案 1 :(得分:10)

对于使用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)
}

答案 2 :(得分:6)

我一直在寻找相同的解决方案。我略微改变了this的答案,使其更适合问题。从构造函数中调用以下代码。

Label

答案 3 :(得分:4)

您应该将其引用为

$scope.options.columns[3].hidden = true;

答案 4 :(得分:0)

尝试以下代码。

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

答案 5 :(得分:0)

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

注意:Foreground需要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));
}

答案 6 :(得分:0)

对于 Kotlin,我正在使用

binding.yourCoolView.apply {
    background = with(TypedValue()) {
        context.theme.resolveAttribute(
            R.attr.selectableItemBackground, this, true)
        ContextCompat.getDrawable(context, resourceId)
    }
}

答案 7 :(得分:-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);