Programmatically set '?selectableItemBackground' on Android view

后端 未结 7 1321
余生分开走
余生分开走 2020-12-12 20:25

In xml, I often do this to emulate onClick effect:



        
相关标签:
7条回答
  • 2020-12-12 20:39

    Based on @Wirling answer we can use foreground to set both the color and the ripple effect

    Note: Foreground requires android API level 23(M) and above:

    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));
    }
    
    0 讨论(0)
  • 2020-12-12 20:42

    For those who work with Kotlin, here are some extensions functions to add Ripple on Android View type :

    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)
    }
    
    0 讨论(0)
  • 2020-12-12 20:43

    For appcompat you can use,

    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
    cardView.setBackgroundResource(outValue.resourceId);
    
    0 讨论(0)
  • 2020-12-12 20:43

    From a fragment:

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

    From an adapter declaring in its constructor the context or the same fragment:

    TypedValue outValue = new TypedValue();
    fragment.requireContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
    holder.cardView.setBackgroundResource(outValue.resourceId);
    
    0 讨论(0)
  • 2020-12-12 20:49

    I was looking for the same solution. I slightly changed this answer to make it more suitable for the asked question. Call the following code from your constructor.

    private void setClickableAnimation(Context context)
    {
        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute( 
            android.R.attr.selectableItemBackground, outValue, true);        
        setForeground(getDrawable(context, outValue.resourceId));
    }
    
    0 讨论(0)
  • 2020-12-12 20:52

    Try below 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();
    
    0 讨论(0)
提交回复
热议问题