Impostare a livello di programmazione ‘?selectableItemBackground’ su Android vista

In xml, mi capita spesso di fare questo per emulare onClick effetto:

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?selectableItemBackground">

    ...

</android.support.v7.widget.CardView>

C’è un modo per accedere ?selectableItemBackground in java?

 

5 Replies
  1. 110

    Per appcompat è possibile utilizzare,

    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
    cardView.setBackgroundResource(outValue.resourceId);
    • utili link, grazie!
    • Ho cercato un sacco e ho trovato un sacco di risposte, ma questo è sicuramente il migliore. Grazie mille!
    • non funziona per me la creazione di un’Immagine Vista a livello di programmazione e impostazione di questa risorsa alongwith selezionabili e attivabili vero
    • Questo cambia sfondo non di primo piano, quindi, se si dispone già di uno sfondo personalizzato per la vista che si sostituisce. Non so come questo possa essere la risposta giusta
  2. 15

    Per coloro che lavorano con Kotlin, qui ci sono alcune estensioni di funzioni per aggiungere Ripple su Android tipo di Visualizzazione :

    private fun View.addRipple() = with(TypedValue()) {
        context.theme.resolveAttribute(android.R.attr.selectableItemBackground, this, true)
        setBackgroundResource(resourceId)
    }
    
    private fun View.addCircleRipple() = with(TypedValue()) {
        context.theme.resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, this, true)
        setBackgroundResource(resourceId)
    }
  3. 6

    Stavo cercando la stessa soluzione. Ho leggermente modificato questo risposta per renderlo più adatto per la domanda. Chiamare il seguente codice nel costruttore.

    private void setClickableAnimation(Context context)
    {
        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute( 
            android.R.attr.selectableItemBackground, outValue, true);        
        setForeground(getDrawable(context, outValue.resourceId));
    }
  4. 0

    Provare sotto il codice.

    int[] attrs = new int[]{R.attr.selectableItemBackground};
    TypedArray typedArray = context.obtainStyledAttributes(attrs);
    int backgroundResource = typedArray.getResourceId(0, 0);
    cardView.setBackgroundResource(backgroundResource);
    cardView.setClickable(true);
    typedArray.recycle();
    • Mi dispiace ma questo codice non ha senso per me, qual è il punto di ottenere TypedArray se non stai ricevendo alcun risorsa da esso?

Lascia un commento