android - ¿Cómo agrego selectableItemBackground a un ImageButton programmatically?
attr r.java-file (5)
android.R.attr.selectableItemBackground existe, pero ¿cómo lo agrego programáticamente a un ImageButton?
Además, ¿cómo podría encontrar la respuesta en la documentación? Se menciona here , pero no veo ninguna explicación de cómo se usa en realidad. En realidad, rara vez me parece útil la documentación, pero espero que sea por mi culpa y no por la de la documentación.
Aquí hay un ejemplo usando la respuesta aquí: ¿Cómo obtener la referencia attr en el código?
// 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);
Esto funciona para mí con mi TextView
:
// Get selectable background
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
clickableTextView.setClickable(true);
clickableTextView.setBackgroundResource(typedValue.resourceId);
Como uso la biblioteca AppCompat, utilizo R.attr.selectableItemBackground
no android.R.attr.selectableItemBackground
.
Creo que typedValue.resourceId
contiene todos los typedValue.resourceId
de selectableItemBackground
que utilizando TypeArray#getResourceId(index, defValue)
o TypeArray#getDrawable(index)
que solo recuperan un drawable en el index
dado.
Prueba este método:
public Drawable getDrawableFromAttrRes(int attrRes, Context context) {
TypedArray a = context.obtainStyledAttributes(new int[] {attrRes});
try {
return a.getDrawable(0);
} finally {
a.recycle();
}
}
// Entonces solo llámalo así:
getDrawableFromAttrRes(R.attr.selectableItemBackground, context)
// Example
ViewCompat.setBackground(view,getDrawableFromAttrRes(R.attr.selectableItemBackground, context))
Si está utilizando AppCompat, podría usar el siguiente código:
int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
view.setBackgroundResource(backgroundResource);
typedArray.recycle();
Use esta función de extensión en kotlin
fun View.setBackgroundResource() {
val outValue = TypedValue() context.theme.resolveAttribute(R.attr.selectableItemBackground,outValue,true)
this.backgroundResource = outValue.resourceId
}