Frage

Ich habe einen Bildschirm, auf dem der Benutzer viele Elemente Eingang hat so Platz auf dem Bildschirm an einer Prämie ist.

Ich möchte das Aussehen des Widgets auf dem Bildschirm (bevor der Benutzer drückt es) zu einem EditText oder dem linken Teil des Spinner-Widget ähnlich sein (ohne die normale drehtes Dreieck) auf der rechten Seite der Spinner. Dann, wenn der Benutzer das Widget drückt, wird er / sie den normalen Spinner Auswahldialog bekommen.

Gibt es ein Attribut Spinner Stil kann ich dies erreichen ändern?

Ich habe nicht in der Lage gewesen Code so zu sehen.

Danke

War es hilfreich?

Lösung

Eine Sache, die Sie tun können nehmen Spinner Quellcode von Android-Code-Basis ist, zusammen mit den zugehörigen Layouts und Ressourcen, und nutzen sie Ihre eigenen Widgets erstellen (wahrscheinlich werden Sie nur auf den Pfeil aus dem Layout entfernen müssen und optimieren die Code ein wenig je nach Bedarf).

EDIT: Du hast Recht, nach diesem Beitrag war es eigentlich ganz einfach :) Sie haben zwei Dinge zu tun. Erstellen Sie zunächst eine styles.xml Datei unter res / Werte, öffnen Sie sie und fügen Sie die folgende:

<?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 wird in Ihrem Layout, fügen Sie den Spinner wie folgt aus:

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

Das ist es, jetzt die Spinner sehen wie ein einfaches EditText, ohne dass unuseful und ärgerlich Pfeil nach unten.

Andere Tipps

Dies ist eine ganz alte Frage, aber ich denke immer noch relevant, also hier ist meine Antwort:

einfachste Methode

lencinhaus Antwort ist richtig. Es funktioniert, aber es kann in eine noch einfachere Art und Weise erfolgen: Just another Hintergrund, um es hinzuzufügen. Das folgende Beispiel verwendet die Standard Button Hintergrund für eine homogenere Look-and-Feel:

<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"
    />       

Die syle in der anderen Antwort verwendet hat Mich nicht mehr als einen Hintergrund für die Widget Anwendung. Das kann direkt auf das Widget erfolgen, wodurch die Notwendigkeit für eine neue XML-Datei zu speichern. Natürlich, wenn Sie sowieso einen Stil auf den Spinner anwenden werden, gibt es nichts falsch mit diesem Ansatz.

Warum?

Der Schlüssel zu verstehen, wie es liegt in der Beschreibung der 9-Patch-PNGs funktioniert. Die Linien an den rechten und an der Unterseite für Polsterung verwendet, das heißt, etwas Platz, um zu verhindern durch ihren Inhalt verwendet wird. In diesem Fall wird der Text nach innen. Der Standard Spinner Hintergrund verwendet ein Bild mit einem Pfeil auf der rechten Seite, die außerhalb des nutzbaren Textbereich ist. Siehe Abbildung 1 unten für eine Darstellung:

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

Sie einfach den Pfeil zu entfernen, ist nicht genug, da die Polsterung bleibt. Sie müssen mit einem verringerten padding ein neues 9-Patch-Bild verwenden (Abbildung 2 für ein Beispiel siehe basierend auf Abb. 1) oder die Verwendung eines der vorkompilierte 9-Patch-Bilder ohne so viel Polsterung, wie die, die für EditText (< strong> @android:drawable/edit_text ) oder Button ( @android:drawable/btn_default ).


Abbildung 2. Modifizierte Spinner bacground 9-Patch-PNG mit reduzierter Polsterung.

Dieses Verständnis ermöglicht es Ihnen, Ihre eigenen Hintergründe für die Spinner zu schaffen (und in der Tat für jedes Widget).

Eine bessere Erklärung des 9-Patch-Dateien finden Sie hier

Es ist sehr einfach die Dateien mit dem erstellen draw9patch ausführbaren Datei aus dem SDK ( lesen Sie hier ), aber nichts hindert Sie verwenden Photoshop oder Gimp statt. Denken Sie daran, 9-Patch-PNGs sind einfach nur PNGs! Die einzige Einschränkung ist, um sicherzustellen, dass Sie nur auf die äußeren Linien von Pixeln und dass der Rest der Pixel sind vollständig transparent zu zeichnen. Antialiasing der Nähe der Grenze zu unerwarteten Ergebnissen führen.

ich auf diese Frage gerade angekommen, weil mein Spinner war nicht das Dreieck Indikator zeigt, habe ich jetzt verstehen, warum: Ich habe den Hintergrund zu „weiß“ Einstellung:

android:background="#FFFFFFFF"

Dies entfernt den Dreieck-Indikator (das Spinner Hintergrundbild und Polsterung von Aleadam angegeben).

Für mein Problem, löse ich es ein Elternteil Linearlayout Hinzufügen nur den Hintergrund auf „weiß“.

Geben Sie ihm einen Hintergrund, der Pfeil verschwinden.

android:background="@drawable/bg"

Ich habe das gleiche Problem mit und verändern die Art zu:

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

und es hat funktioniert.

Wie seltsam, sein in DropDownItem befindet.

Während derjenige, der das untere Dreieck haben die normale genannt.

Cheers!

Ein verwandtes Problem des Raumes genommen, wenn Sie auf tatsächlich auf Spinner, fand ich durch Zufall, dass Sie diese großen Auswahl Indikatoren im rechten entfernen können. Sie erhalten eine Grundliste durch Linien getrennt, aber Sie können auf ein Element klicken und es funktioniert immer noch.

ein Spinner wie diese einrichten, um die Auswahlindikatoren zu erhalten:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.petals, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter1);

Für nur keine Indikatoren, die die setDropDownViewResource Linie auslassen.

, warum Sie mit der Liste für einen Dialog nicht gehen. Entsprechend Ihrer Anforderung, erstellen setOnFocusChangeListener ein EditText Feld hinzufügen und anschließend einen Dialog mit Listenelementen in onFocusChange () -Methode zeigen. Für den Dialog mit Listenelementen

new AlertDialog.Builder(this)
                .setTitle("<Title>")
                .setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
     @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub  
}}).show();

Keine Antwort war hilfreich für mich, also hier ist eine wirklich einfache einzeilige Lösung, die funktioniert.

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

Ich kann nicht sicher sagen, ob es nur mit einem Standard-Spinnern Layout arbeiten, aber es funktionierte gut mit meiner Gewohnheit, dass ich für andere Bedürfnisse erstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top