2012-12-14 7 views
14

Ho un Spinner in modalità spinnerMode="dropdown". Al posto del primo elemento preselezionato, voglio mostrare all'utente un suggerimento, in modo che non v'è alcuna selezione di default (come »Seleziona articolo«)Come posso aggiungere un suggerimento al widget Spinner?

Questa è l'interfaccia utente che ho ottenuto:

the current UI

e questo è l'interfaccia utente che voglio achive:

the UI I want to achive

ho pensato che il widget EditText ha un attributo android:hint, ma non il Spinner widget e impostazione non mi porta l'interfaccia utente che voglio. Si tratta di un'app Android 4.x-only, quindi non devo preoccuparmi di alcuna compatibilità pre-4.0.

+1

se ** android: prompt = "@ String/select" ** funzionerà o no.? –

+1

Purtroppo no: il prompt è per il menu a discesa che appare dopo aver registrato il widget 'Spinner'. Inoltre, non funziona se si utilizzano gli Holo-Themes che sono nuovi in ​​Android 4.x. –

+0

L'adattatore spinner ha diversi metodi, uno per la visualizzazione a discesa e uno per la visualizzazione elenco con tutte le opzioni. Quindi, quando non viene selezionato nulla, l'adattatore restituisce questo TextView per impostazione predefinita, altrimenti l'elemento selezionato. –

risposta

23

non ho ancora trovato una soluzione semplice e pulita, solo questa soluzione utilizzando adattatori personalizzati e una classe di elemento personalizzato:

In primo luogo, abbiamo bisogno di una classe per il contenuto oggetto filatore:

class SpinnerItem { 
     private final String text; 
     private final boolean isHint; 

     public SpinnerItem(String strItem, boolean flag) { 
      this.isHint = flag; 
      this.text = strItem; 
     } 

     public String getItemString() { 
      return text; 
     } 

     public boolean isHint() { 
      return isHint; 
     } 
    } 

Allora la nostra classe di adattatori:

class MySpinnerAdapter extends ArrayAdapter<SpinnerItem> { 
     public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) { 
      super(context, resource, objects); 
     } 

     @Override 
     public int getCount() { 
      return super.getCount() - 1; // This makes the trick: do not show last item 
     } 

     @Override 
     public SpinnerItem getItem(int position) { 
      return super.getItem(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return super.getItemId(position); 
     } 

    } 

Infine abbiamo utilizzare la soluzione in questo modo:

ArrayList<SpinnerItem> items = new ArrayList<SpinnerItem>(); 
     items.add(new SpinnerItem("Item 1", false)); 
     items.add(new SpinnerItem("Item 2", false)); 
     items.add(new SpinnerItem("HINT", true)); // Last item 

     MySpinnerAdapter adapter = new MySpinnerAdapter(this, android.R.layout.simple_spinner_item, items); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
     spinner.setSelection(items.size() - 1); 

Quindi è possibile utilizzare il flag della classe SpinnerItem per impostare il colore del testo per quell'elemento o altro.

+0

bello! Mi piace questo lavoro. Domanda: qual è il colore del testo suggerito in un testo di modifica? –

+0

appare come il colore del testo di un suggerimento in un testo di modifica è 'Color.rgb (148, 150, 148)' –

+0

per impostare il colore del testo di suggerimento, ho implementato la classe 'AdapterView.OnItemSelectedListener' e all'interno di' onItemSelected'. esegue 'SpinnerItem data = items.get (posizione);' seguito da 'if (data.isHint() {do stuff}' –

Problemi correlati