Android.R.attr.selectableItemBackground existe, mais comment l'ajouter par programme à un ImageButton?
De plus, comment pourrais-je trouver la réponse dans la documentation? Il est mentionné ici , mais je ne vois aucune explication sur la façon dont il est réellement utilisé. En fait, il me semble rarement que la documentation soit utile, mais j'espère que c'est ma faute et non celle de la documentation.
Voici un exemple utilisant la réponse ici: Comment obtenir la référence attr dans le 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);
Si vous utilisez AppCompat, vous pouvez utiliser le code suivant:
int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
view.setBackgroundResource(backgroundResource);
typedArray.recycle();
Cela fonctionne pour moi avec mon TextView
:
// Get selectable background
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
clickableTextView.setClickable(true);
clickableTextView.setBackgroundResource(typedValue.resourceId);
Étant donné que j'utilise la bibliothèque AppCompat, j'utilise R.attr.selectableItemBackground
Et non Android.R.attr.selectableItemBackground
.
Je pense que typedValue.resourceId
Contient tous les dessinables de selectableItemBackground
plutôt que d'utiliser TypeArray#getResourceId(index, defValue)
ou TypeArray#getDrawable(index)
qui ne récupèrent qu'un drawable au index
donné .
Essayez cette méthode:
public Drawable getDrawableFromAttrRes(int attrRes, Context context) {
TypedArray a = context.obtainStyledAttributes(new int[] {attrRes});
try {
return a.getDrawable(0);
} finally {
a.recycle();
}
}
// Ensuite, appelez-le comme ceci:
getDrawableFromAttrRes(R.attr.selectableItemBackground, context)
// Example
ViewCompat.setBackground(view,getDrawableFromAttrRes(R.attr.selectableItemBackground, context))