42 Stimmen

Wie erstellt man einen Android-Spinner ohne nach unten zeigendes Dreieck auf der rechten Seite des Widgets?

Ich habe einen Bildschirm, auf dem der Benutzer viele Elemente eingeben muss, so dass der Platz auf dem Bildschirm sehr knapp bemessen ist.

Ich möchte, dass das Widget auf dem Bildschirm (bevor der Benutzer darauf drückt) ähnlich aussieht wie ein EditText oder der linke Teil des Spinner-Widgets (ohne das normale Dreieck nach unten) auf der rechten Seite des Spinners. Wenn der Benutzer dann auf das Widget drückt, wird er/sie den normalen Spinner-Auswahldialog erhalten.

Gibt es einige Spinner-Stil-Attribut kann ich ändern, um dies zu erreichen?

Ich habe einen solchen Code noch nicht gesehen.

Gracias

67voto

Aleadam Punkte 39803

Diese Frage ist schon ziemlich alt, aber ich denke, sie ist immer noch aktuell, deshalb hier meine Antwort:

Einfachste Methode

lencinhaus Antwort ist richtig. Es funktioniert, aber es kann noch einfacher gemacht werden: Fügen Sie einfach einen anderen Hintergrund hinzu. Das folgende Beispiel verwendet den Standard Button Hintergrund für ein homogeneres Aussehen und Gefühl:

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/my_prompt" 
    android:background="@android:drawable/btn_default"
    />       

Der Stil, der in der anderen Antwort verwendet wird, tut nicht mehr als einen Hintergrund auf das Widget anzuwenden. Das kann direkt im Widget geschehen, so dass keine neue Xml-Datei erforderlich ist. Natürlich, wenn Sie gehen, um einen Stil auf den Spinner sowieso anwenden, es ist nichts falsch mit diesem Ansatz.

Und warum?

Der Schlüssel zum Verständnis der Funktionsweise liegt in der Beschreibung der 9-Patch PNGs . Die Zeilen rechts und unten dienen zum Auffüllen, d. h., um zu verhindern, dass der Inhalt Platz wegnimmt. In diesem Fall ist das der Text im Inneren. Der Standardhintergrund von Spinner verwendet ein Bild mit einem Pfeil auf der rechten Seite, der sich außerhalb des nutzbaren Textbereichs befindet. Siehe Abbildung 1 unten zur Veranschaulichung:

Abbildung 1. Original Spinner-Hintergrund 9-patch PNG http://tinypic.com/images/404.gif
Abbildung 1. Original Spinner Hintergrund 9-Patch PNG.

Es reicht nicht aus, den Pfeil zu entfernen, da die Polsterung bestehen bleibt. Sie müssen ein neues 9-Felder-Bild mit verringerter Füllung verwenden (siehe Abbildung 2 für ein Beispiel auf der Grundlage von Abbildung 1) oder eines der vorkompilierten 9-Felder-Bilder ohne so viel Füllung verwenden, z. B. die Bilder für EditText ( @android:drawable/edit_text ) o Button ( @android:drawable/btn_default ).

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
Abbildung 2. Geändert Spinner Hintergrund 9-Patch PNG mit reduziertem Padding.

Wenn Sie dies verstehen, können Sie Ihre eigenen Hintergründe für die Spinner (und in der Tat für jedes Widget).

Eine bessere Erklärung der 9-Patch-Dateien können hier gefunden werden

Es ist sehr einfach, die Dateien mit dem draw9patch ausführbare Datei aus dem SDK ( Lesen Sie hier darüber ), aber nichts hindert Sie daran, die Photoshop o Gimp stattdessen. Denken Sie daran, dass 9-Patch-PNGs nur einfache PNGs sind! Die einzige Einschränkung besteht darin, dass Sie nur die äußeren Linien der Pixel zeichnen dürfen und dass der Rest der Pixel vollständig transparent ist. Antialiasing in Grenznähe kann zu unerwarteten Ergebnissen führen.

40voto

lencinhaus Punkte 3165

Eine Sache, die Sie tun können, ist Spinner Quellcode aus der Android-Codebasis, zusammen mit den zugehörigen Layouts und Ressourcen, und verwenden Sie sie, um Ihr eigenes benutzerdefiniertes Widget zu erstellen (wahrscheinlich müssen Sie nur den Pfeil aus dem Layout entfernen und den Code je nach Ihren Bedürfnissen ein wenig anpassen).

EDIT: Du hast Recht, nach diesem Beitrag war es eigentlich ganz einfach :) Du musst zwei Dinge tun. Erstens, erstellen Sie eine styles.xml-Datei unter res/values, öffnen Sie es und fügen Sie die folgenden:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style parent="@android:style/Widget.Spinner" name="SpinnerAsEditText">
        <item name="android:background">@android:drawable/edit_text</item>
    </style>
</resources>

Als nächstes fügen Sie in Ihrem Layout den Spinner wie folgt hinzu:

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

Das war's, jetzt sieht der Spinner wie ein einfacher EditText aus, ohne den unbrauchbaren und lästigen Abwärtspfeil.

15voto

pvalle Punkte 915

Ich bin gerade auf diese Frage gekommen, weil mein Spinner den Dreiecksindikator nicht anzeigte, jetzt verstehe ich warum: Ich hatte den Hintergrund auf "weiß" eingestellt:

android:background="#FFFFFFFF"

Dies entfernt den Dreiecksindikator (das von Aleadam angegebene Spinner-Hintergrundbild und die Polsterung).

Für mein Problem löse ich es, indem ich ein übergeordnetes LinearLayout hinzufüge, nur um den Hintergrund auf "weiß" zu setzen.

7voto

Kai Wang Punkte 3149

Geben Sie ihm einen Hintergrund, dann verschwindet der Pfeil.

android:background="@drawable/bg"

3voto

Abdullah Umer Punkte 3964

Ich hatte das gleiche Problem und änderte den Stil in:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

und es hat funktioniert.

Wie seltsam, es befindet sich in DropDownItem .

Diejenige mit dem unteren Dreieck wird als normal bezeichnet.

Zum Wohl!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X