Domanda Come aggiungo selectableItemBackground a un ImageButton a livello di codice?


android.R.attr.selectableItemBackground esiste, ma come aggiungerlo programmaticamente a un ImageButton?

Inoltre, come potrei fare per trovare la risposta nella documentazione? È menzionato Qui, ma non vedo alcuna spiegazione su come sia effettivamente utilizzato. In realtà, raramente mi sembra utile trovare la documentazione utile, ma spero che sia colpa mia e non della documentazione.


44
2017-12-11 22:45


origine


risposte:


Ecco un esempio usando la risposta qui: Come ottenere il riferimento attr in codice?

    // 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);

50
2017-12-12 09:27



Se stai usando AppCompat puoi usare il seguente codice:

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

45
2017-07-08 12:12



Questo funziona per me con il mio TextView:

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

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

Perché io uso la libreria AppCompat, io uso R.attr.selectableItemBackground non android.R.attr.selectableItemBackground.

credo typedValue.resourceId detiene tutti i drawable da selectableItemBackground che usare TypeArray#getResourceId(index, defValue) o TypeArray#getDrawable(index) che recuperano solo un drawable al dato index.


7
2017-11-28 08:27



Prova questo metodo:

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

// Quindi chiamalo così:

getDrawableFromAttrRes(R.attr.selectableItemBackground, context)

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

0
2018-02-14 18:33



Usa questa funzione di estensione in kotlin

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

-1
2018-01-12 16:08