2012-12-14 10 views
14

Ich habe eine Spinner in spinnerMode="dropdown" Modus. Anstelle des vorgewählten ersten Punkt möchte ich dem Benutzer einen Hinweis zeigen, so dass es keine Standardauswahl ist (wie »Bitte ein Element« wählen)Wie kann ich dem Spinner-Widget einen Hinweis hinzufügen?

Dies ist die UI Ich habe:

the current UI

und das ist die UI ich achive wollen:

the UI I want to achive

ich dachte, dass das EditText Widget ein android:hint Attribut hat, aber nicht die Spinner Widget und Einstellung bringt mir nicht die Benutzeroberfläche ich will. Dies ist eine Android 4.x-only-App, so dass ich keine Probleme mit Kompatibilitätsproblemen vor 4.0 haben muss.

+1

ob ** android: prompt = "@ String/select" ** funktioniert oder nicht.? –

+1

Leider nein: Die Eingabeaufforderung bezieht sich auf das Dropdown-Menü, das nach dem Aufzeichnen des Widgets "Spinner" angezeigt wird. Und weiter geht es nicht, wenn man Holo-Themes verwendet, die in Android 4.x neu sind. –

+0

Der Spinner-Adapter hat verschiedene Methoden, eine für die Dropdown-Ansicht und eine für die Listenansicht mit allen Optionen. Wenn nichts ausgewählt ist, gibt der Adapter diese TextView standardmäßig zurück, ansonsten das ausgewählte Element. –

Antwort

23

Ich habe nicht eine einfache und saubere Lösung noch nicht gefunden, nur diese Abhilfe mit benutzerdefinierten Adapter und eine benutzerdefinierte Klasse:

Zuerst müssen wir eine Klasse für den Spinner Artikel Inhalt:

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; 
     } 
    } 

Dann ist unser Adapter-Klasse:

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

    } 

Schließlich verwenden wir die Problemumgehung wie folgt aus:

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

Dann können Sie das Flag aus der SpinnerItem-Klasse verwenden, um die Textfarbe für dieses Element oder was auch immer einzustellen.

+0

nett! Ich mag diese Umgehung. Frage: Welche Farbe hat der Hinweistext in einem Bearbeitungstext? –

+0

sieht aus wie die Textfarbe eines Hinweises in einem Bearbeitungstext ist 'Color.rgb (148, 150, 148)' –

+0

um die Farbe des Hinweistextes zu setzen, habe ich die 'AdapterView.OnItemSelectedListener' Klasse und innerhalb' onItemSelected' implementiert es führt 'SpinnerItem data = items.get (position);' gefolgt von 'if (data.isHint() {do stuff}' –

Verwandte Themen