2015-10-20 10 views
5

Non riesco a ottenere il ripple dello stato premuto per funzionare su uno Spinner. I singoli elementi a discesa hanno l'ondulazione, ma non lo stesso spinner. Ho pensato che forse questo era un comportamento previsto, ma questa animazione dalle linee guida sul design dei materiali mostra chiaramente lo spinner con un'increspatura di stato premuto prima che appaia il menu a discesa delle opzioni.Lo spinner Android non ha il ripple sul pulsante stesso, solo le sue opzioni

https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B3321sZLoP_HTS1LdnhrTl9TRzg/components-buttons-otherbuttons-060203_MobileDropdowns_xhdpi_006.webm

+0

Puoi pubblicare ciò che si provato fino ad ora? Forse questo può aiutare http://stackoverflow.com/questions/27860815/ripple-effect-on-spinner-dropdown-items-colored-background-appcompat-v7-v21 – bonnyz

risposta

2

ho creato un nuovo Spinner in un Activity e come hai descritto, il RippleDrawable non viene applicato al Spinner utilizzando la libreria di compatibilità v7 o su Android 5.0+. Questo non mi sorprende; Google spesso non riesce a implementare il proprio design.

Per avere l'effetto, tutto ciò che ho fatto è stato creare un RippleDrawable in res/values-v21/e impostarlo come sfondo sullo Spinner utilizzando spinner.setBackgroundResource(R.drawable.spinner_background);. Sono sicuro che puoi anche impostare questo nel tuo tema.

+0

Sto iniziando a pensare che Google di proposito non ha implementato è un design proprio perché il popup/dropdown arriva così velocemente. È ancora molto frustrante per me, ma forse sono l'unica persona a preoccuparmi davvero. Impostando lo sfondo su questo rimuove lo sfondo esistente che ha uno stato premuto e un indicatore colorato. Inoltre non è retrocompatibile. –

0

impostare queste proprietà Spinner in xml

android:background="@drawable/ripple_effect" 
android:dropDownSelector="@drawable/ripple_effect" 

e ripple_effect.xml sarà simile a questa

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
android:color="?android:colorControlHighlight" > 

    <item android:id="@android:id/mask"> 
     <shape android:shape="rectangle" > 
      <solid android:color="?android:colorAccent" /> 
     </shape> 
    </item> 
</ripple> 
+0

Impostando lo sfondo su questo rimuove lo sfondo esistente che ha uno stato premuto e un indicatore colorato. Inoltre non è retrocompatibile. –

0

C'è una biblioteca su Github, vale a dire Material Ripple Layout. Questa libreria supporta dispositivi pre-Lollipop e Lollipop. Inoltre, così puoi creare il tuo colore per l'ondulazione. Ecco l'utilizzo:

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
MaterialRippleLayout.on(spinner) 
     .rippleColor(Color.BLACK) 
     .create(); 

Ma io non uso quella libreria. Sto usando il ripple predefinito di Spinner che è stato introdotto nella libreria di supporto rev 23.0.1, compilando: compile 'com.android.support:appcompat-v7:23.0.1' nel modulo app nel modulo app.

Quindi, ecco il mio codice completo per il layout Spinner:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:dropDownVerticalOffset="@dimen/dropDown_spinner" 
     style="@style/SpinnerStyle"/> <!-- apply the ripple style --> 

</RelativeLayout> 

Lo stile è definito in res/values/styles.xml:

<style name="SpinnerStyle" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar"> 
    <item name="android:background">?android:selectableItemBackground</item> 
    <item name="android:dropDownSelector">?android:selectableItemBackground</item> 
    <item name="android:divider">@null</item> 
    <item name="overlapAnchor">true</item> 
</style> 

Dopo di che, l'effetto complessivo dovrebbe funzionare come previsto.

+0

Impostando lo sfondo su questo rimuove lo sfondo esistente che ha uno stato premuto e un indicatore colorato. –

0

Ho utilizzato questa fantastica libreria per applicare effetti di ripple ad alcune viste. Mi piace, perché puoi avvolgere qualsiasi vista nel file XML e applicherà l'effetto a catena.

https://github.com/balysv/material-ripple

Speranza che aiuta.

+0

Mi spiace non sono interessato all'utilizzo di una libreria di terze parti, voglio solo mettere a tema questo componente correttamente. –

0

La speranza sotto il codice darà un senso all'effetto Ripple su Spinner.

ripple_spinner.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <ripple android:color="?android:attr/colorControlHighlight"> 
      <item> 
       <shape> 
        <solid android:color="@android:color/white" /> 
       </shape> 
      </item> 
     </ripple> 
    </item> 

tuo XML: -

your_acitivity.xml

<Spinner 
    android:id="@+id/spinner" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:dropDownSelector="@drawable/ripple_spinner" 
    android:popupBackground="@drawable/popup_spinner_item_background" 
    /> 

Sotto cambierà lo sfondo del menu a discesa.

popup_spinner_item_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
    <corners android:radius="2dp" /> 
    <solid android:color="@android:color/white" /> 
</shape> 

Nella tua res/Valori/styles.xml: -

styles.xml

<resources> 
    <style name="AppTheme" parent="android:Theme.Material.Light"> 
     <!--Workaround for the Android bug--> 
     <item name="android:dropDownListViewStyle">@style/Theme.MyListView</item> 
    </style> 

    <style name="Theme.MyListView" parent="@android:style/Widget.Material.ListView.DropDown"> 
     <item name="android:listSelector">@drawable/spinner_ripple</item> 
    </style> 
</resources> 

Spero che vi aiuterà.

+0

Il popup/menu a discesa funziona già correttamente. Quello che sto cercando di risolvere è lo stato premuto dello spinner stesso. –

0

Non c'è ripple per lo Spinner, poiché lo sfondo non è ripplable. Faccio come segue in un layout selectableItemBackgroundBorderless (https://developer.android.com/training/material/animations.html#Touch):

  1. un 0 -width Spinner, e rimuovere la freccia giù sfondo (usare @null sarà ok), anche io rimuovere lo sfondo di una normale Spinner, non ha ripper, quindi uso TextView e ImageView come il calendario di Google.

  2. un TextView + ImageView (per la freccia giù)

Quando l'utente fa clic TextView/ImageView, ha animazioni ondulazione, quindi chiamare Spinner. performClick. E lo voglio come normale menu a discesa, quindi creo uno spinner di larghezza 0, poiché lo Spinner gone non chiamerà onItemSelected.

per l'adattatore nascosta, può in questo modo:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    ((TextView) view).setText(""); 
    return view; 
} 

Il layout click ascoltatore:

layout.setOnClickListener(() -> { 
    spinner.performClick(); 
}); 

Per la voce filatore ascoltatore:

spinner.setOnItemSelectedListener(() -> { 
    // this requires spinner's visiblity is not gone 
}); 
Problemi correlati