Comment append selectableItemBackground à un ImageButton par programmation?

android.R.attr.selectableItemBackground existe, mais comment puis-je l’append par programme à un ImageButton?

Comment puis-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 effectivement utilisé. En fait, je semble rarement trouver la documentation utile, mais j’espère que c’est de 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 atsortingbutes 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 atsortingbutes. 'themedContext' is a context with a // theme, typically the current Activity (ie 'this') TypedArray ta = obtainStyledAtsortingbutes(attrs); // Now get the value of the 'listItemBackground' atsortingbute that was // set in the theme used in 'themedContext'. The parameter is the index // of the atsortingbute 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.obtainStyledAtsortingbutes(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().resolveAtsortingbute(R.attr.selectableItemBackground, typedValue, true); clickableTextView.setClickable(true); clickableTextView.setBackgroundResource(typedValue.resourceId); 

    Comme j’utilise la bibliothèque AppCompat, j’utilise R.attr.selectableItemBackground non android.R.attr.selectableItemBackground .

    Je pense que typedValue.resourceId contient tous les tirables de selectableItemBackground en utilisant TypeArray#getResourceId(index, defValue) ou TypeArray#getDrawable(index) qui ne récupèrent qu’un dessin à l’ index donné.

    Essayez cette méthode:

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

    // Alors appelle-le comme ceci:

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

    Utilisez cette fonction d’extension dans kotlin

     fun View.setBackgroundResource() { val outValue = TypedValue() context.theme.resolveAtsortingbute(R.attr.selectableItemBackground,outValue,true) this.backgroundResource = outValue.resourceId }