How do I add selectableItemBackground to an ImageButton programmatically?

AndroidAttrr.java File

Android Problem Overview


android.R.attr.selectableItemBackground exists, but how do I add it programatically to an ImageButton?

Also, how would I go about finding the answer in the documentation? It's mentioned here, but I don't see any explanation of how it's actually used. Actually, I rarely seem to find the documentation useful, but I'm hoping that's my fault and not that of the documentation.

Android Solutions


Solution 1 - Android

Here is an example using answer here: https://stackoverflow.com/questions/9398610/how-to-get-the-attr-reference-in-code

	// Create an array of the attributes we want to resolve
	// using values from a theme
	// android.R.attr.selectableItemBackground requires API LEVEL 11
	int[] attrs = new int[] { android.R.attr.selectableItemBackground /* index 0 */};

	// Obtain the styled attributes. 'themedContext' is a context with a
	// theme, typically the current Activity (i.e. 'this')
	TypedArray ta = obtainStyledAttributes(attrs);

	// Now get the value of the 'listItemBackground' attribute that was
	// set in the theme used in 'themedContext'. The parameter is the index
	// of the attribute in the 'attrs' array. The returned Drawable
	// is what you are after
	Drawable drawableFromTheme = ta.getDrawable(0 /* index */);

	// Finally free resources used by TypedArray
	ta.recycle();
	
	// setBackground(Drawable) requires API LEVEL 16, 
	// otherwise you have to use deprecated setBackgroundDrawable(Drawable) method. 
	imageButton.setBackground(drawableFromTheme);
	// imageButton.setBackgroundDrawable(drawableFromTheme);

Solution 2 - Android

If you are using AppCompat you could use following code:

int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
view.setBackgroundResource(backgroundResource);
typedArray.recycle();

Solution 3 - Android

This works for me with my TextView:

// Get selectable background
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);

clickableTextView.setClickable(true);
clickableTextView.setBackgroundResource(typedValue.resourceId);

Because I use AppCompat library, I use R.attr.selectableItemBackground not android.R.attr.selectableItemBackground.

I think typedValue.resourceId holds all drawables from selectableItemBackground than using TypeArray#getResourceId(index, defValue) or TypeArray#getDrawable(index) which are retrieve only a drawable at the given index.

Solution 4 - Android

Try this method:

public Drawable getDrawableFromAttrRes(int attrRes, Context context) {
    TypedArray a = context.obtainStyledAttributes(new int[] {attrRes});
    try {
        return a.getDrawable(0);
    } finally {
        a.recycle();
    }
}

// Then just call it like this:

getDrawableFromAttrRes(R.attr.selectableItemBackground, context)

// Example
ViewCompat.setBackground(view,getDrawableFromAttrRes(R.attr.selectableItemBackground, context))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionabc32112View Question on Stackoverflow
Solution 1 - AndroidTimuçinView Answer on Stackoverflow
Solution 2 - AndroidAndrey TView Answer on Stackoverflow
Solution 3 - AndroidmaohiengView Answer on Stackoverflow
Solution 4 - AndroidSergio SerraView Answer on Stackoverflow