web-dev-qa-db-fra.com

Comment ajouter par programme selectableItemBackground à un ImageButton?

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.

49
abc32112

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);
53
Timuçin

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();
50
Andrey T

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é .

8
maohieng

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))
3
Sergio Serra