Erstellen eines setError() für den Spinner

Lesezeit: 8 Minuten

Erstellen eines setError fur den Spinner
Sameer Segal

Wie erstellt man die setError() (ähnlich wie bei a TextView/EditText) Funktion für a Spinner? Folgendes funktioniert nicht:

Ich habe versucht, die Spinner-Klasse zu erweitern und im Konstruktor:

ArrayAdapter<String> aa = new ArrayAdapter<String>(getContext(),
                    android.R.layout.simple_spinner_item, android.R.id.text1,
                    items);
            aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            setAdapter(aa);
             tv = (TextView) findViewById(android.R.id.text1);
            // types_layout_list_tv

            ctv = (CheckedTextView) aa.getDropDownView(1, null, null);
            tv2 = (TextView) aa.getView(1, null, null);

setError Methode:

    public void setError(String str) {
        if (tv != null)
            tv.setError(str);
        if(tv2!=null)
            tv2.setError(str);
        if (ctv != null)
            ctv.setError(str);
    }

  • Was mich an unserem Beispiel verwundert: Woher kommen die TextView tv, ctv und tv2 und was haben sie mit dem Spinner zu tun? Grüße, Ready4Android

    – Ready4Android

    18. September ’11 um 9:16


  • Hast du die Lösung dafür?

    – Code_Life

    6. Februar ’12 um 13:04

Ähnlich wie bei der Lösung von @Gábor, aber ich musste keinen eigenen Adapter erstellen. Ich rufe einfach den folgenden Code in meiner Validierungsfunktion auf (dh beim Klicken auf die Schaltfläche zum Senden)

        TextView errorText = (TextView)mySpinner.getSelectedView();                  
        errorText.setError("anything here, just to add the icon");
        errorText.setTextColor(Color.RED);//just to highlight that this is an error
        errorText.setText("my actual error text");//changes the selected item text to this

  • konnte das nicht zum laufen bringen. Ich habe zwei Spinner, beide geben null auf getSelectedView() zurück, außer dass die Lösung am besten aussah

    – John

    17. Dez. ’14 um 20:59


  • @John Ich habe mein android.widget.Spinner als Instanzvariable in der onCreateView-Methode gespeichert und dann in einer anderen Methode wieder darauf zugegriffen, in meinem Fall der onDoneAction-Methode. Stellen Sie sicher, dass Sie getSelectedView aufrufen, nachdem ein Element im Spinner tatsächlich ausgewählt wurde, dh getSelectedItem() gibt auch nicht-null zurück

    – EdmundYeung99

    6. Januar ’15 um 14:30 Uhr


  • gute Antwort! Die ausgewählte Ansicht ist eigentlich eine TextView, also funktioniert dies wie erwartet!

    – Ryan Amaral

    24. Juli ’15 um 15:29

Erstellen eines setError fur den Spinner
Gabor

Ich habe eine Lösung, bei der kein zusätzliches Bearbeitungsfeld erstellt werden muss, aber Sie benötigen Ihr eigenes SpinnerAdapter, wie gewöhnlich.

Stellen Sie sicher, dass Sie mindestens eine haben TextView im Layout, das Sie in Ihrem Adapter verwenden getView() (das hast du normalerweise sowieso).

Fügen Sie Ihrem Adapter die folgende Funktion hinzu (ändern name auf die ID deines TextView):

public void setError(View v, CharSequence s) {
  TextView name = (TextView) v.findViewById(R.id.name);
  name.setError(s);
}

Ruf den setError() aus deinem Code auf diese Weise:

YourAdapter adapter = (YourAdapter)spinner.getAdapter();
View view = spinner.getSelectedView();
adapter.setError(view, getActivity().getString(R.string.error_message));

Im Grunde wie bei jedem anderen Steuerelement nur, dass Sie es auf Ihrem Adapter aufrufen und auch die Ansicht bereitstellen müssen.

Dadurch wird das Fehlersymbol auf dem Spinner angezeigt, wie es bei anderen Steuerelementen der Fall ist.

  • Das ist eine tolle Lösung

    – EladHackim

    27. Dez. 14 um 14:30 Uhr

  • Wenn width=wrap_content, wird das Fehlersymbol nicht richtig angezeigt – wird unter dem Spinner-Symbol versteckt

    – Wuff

    27. Juli ’15 um 8:28

Erstellen eines setError fur den Spinner
CJBS

Verwenden einer versteckten Textansicht, um eine Popup-Meldung anzuzeigen

Bei dieser Lösung wird ein zusätzliches verstecktes Textfeld direkt unter dem Spinner genau an der richtigen Position hinzugefügt, damit der Fehlerdialog des TextView angezeigt werden kann, während gleichzeitig das TextView-Set in der Layout-XML des Spinners verwendet wird, um die Anzeige des roten (!) Symbols zu ermöglichen. Tatsächlich werden also zwei Textansichten verwendet – eine für das Symbol und eine andere (ausgeblendet), um den Fehlerdialog zu ermöglichen.

So sieht es aus, wenn kein Fehlerzustand vorliegt (verwenden Sie SetError(null)):

Spinner im gültigen Zustand

So sieht es aus, wenn ein Fehler auftritt (verwenden Sie SetError("my error text, ideally from a resource!")):

Spinner in ungültigem Zustand

Hier ist der Auszug aus dem Layout-XML des Spinners. Es wird ein RelativeLayout verwendet, um sicherzustellen, dass sich die Textansicht so nah wie möglich am Spinner befindet und gerade genug paddingRight hat, um sicherzustellen, dass der Pfeil im Nachrichtendialog direkt unter dem roten Fehlersymbol (!) ausgerichtet ist. Die versteckte (gefälschte) TextView wird relativ zum Spinner positioniert.

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="top|left"
        >

        <Spinner
            android:id="@+id/spnMySpinner"
            android:layout_width="400dp"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:dropDownSelector="@drawable/selector_listview"
            android:background="@android:drawable/btn_dropdown"
            android:paddingBottom="0dp"
            android:layout_marginBottom="0dp"
            />

        <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView -->
        <android.widget.TextView
            android:id="@+id/tvInvisibleError"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_alignRight="@+id/spnMySpinner"
            android:layout_alignBottom="@+id/spnMySpinner"
            android:layout_marginTop="0dp"
            android:paddingTop="0dp"
            android:paddingRight="50dp"
            android:focusable="true"
            android:focusableInTouchMode="true"
            />

    </RelativeLayout>

Notiz: @drawable/selector_listview außerhalb des Anwendungsbereichs dieser Lösung definiert. Sehen Sie sich hier ein Beispiel an, wie dies funktioniert, da es für diese Antwort nicht zum Thema gehört.

Hier ist der Code, damit es funktioniert. Rufen Sie einfach an SetError(errMsg) entweder mit null um den Fehler zu löschen, oder mit Text, um ihn in einen Fehlerzustand zu versetzen.

/**
 * When a <code>errorMessage</code> is specified, pops up an error window with the message
 * text, and creates an error icon in the secondary unit spinner. Error cleared through passing
 * in a null string.
 * @param errorMessage Error message to display, or null to clear.
 */
public void SetError(String errorMessage)
{
    View view = spnMySpinner.getSelectedView();

    // Set TextView in Secondary Unit spinner to be in error so that red (!) icon
    // appears, and then shake control if in error
    TextView tvListItem = (TextView)view;

    // Set fake TextView to be in error so that the error message appears
    TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError);

    // Shake and set error if in error state, otherwise clear error
    if(errorMessage != null)
    {
        tvListItem.setError(errorMessage);
        tvListItem.requestFocus();

        // Shake the spinner to highlight that current selection 
        // is invalid -- SEE COMMENT BELOW
        Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
        spnMySpinner.startAnimation(shake);

        tvInvisibleError.requestFocus();
        tvInvisibleError.setError(errorMessage);
    }
    else
    {
        tvListItem.setError(null);
        tvInvisibleError.setError(null);
    }
}

Im SetError Funktion oben, Beispiel gibt es zusätzlichen Code, der bewirkt, dass der Text im Spinner wackelt, wenn der Fehler gesetzt wird. Dies ist nicht erforderlich, damit die Lösung funktioniert, ist aber eine nette Ergänzung. Siehe hier für die Inspiration für diesen Ansatz.

Ein großes Lob an @Gábor für seine Lösung, die die TextView im XML-Element-Layout des Spinners verwendet. Der Code View view = spnMySpinner.getSelectedView(); (basierend auf @Gábors Lösung) ist notwendig, da es die aktuell angezeigte TextView erhält, anstatt a . zu verwenden findViewById, die nur die erste TextView in der Liste abrufen würde (basierend auf der bereitgestellten Ressourcen-ID) und daher nicht funktionieren würde (um das rote (!) Symbol anzuzeigen), wenn nicht das allererste Element in der Liste ausgewählt ist.

  • In diesem Teil habe ich ein lineares Layout, irgendwelche Hinweise? TextView tvListItem = (TextView)view;

    – vinicius gati

    1. Juni ’18 um 19:17

Dies kann ohne Verwendung eines benutzerdefinierten Layouts oder Adapters erfolgen.

((TextView)spinner.getChildAt(0)).setError("Message");

Der einzige Nachteil dieses Ansatzes ist, dass das kleine Popup mit dem Fehlertext nicht angezeigt wird, wenn das Symbol angetippt wird.

1641749106 801 Erstellen eines setError fur den Spinner
EladHackim

Ich würde dir vorschlagen, ein leeres zu setzen EditText direkt hinter Ihrem Spinner.

Auf dem XML-Set, das EditText

android:enabled="false"
    android:inputType="none"

Wenn Sie jetzt einen Fehler für Ihren Spinner festlegen möchten, stellen Sie diesen Fehler einfach auf den EditText.

Denken Sie daran, das nicht einzustellen EditText zu invisibille / gone. So wird es nicht funktionieren.

Beachten Sie auch, dass Sie mit dieser Methode genau entscheiden können, wo Ihr Fehler angezeigt werden soll.

  • Eine Einschränkung beim Platzieren eines EditText hinter dem Spinner besteht darin, dass Teile des Fehlerprüfverhaltens nicht funktionieren. Obwohl das rote Ausrufezeichen für einen Fehler angezeigt wird, wird beim Klicken auf das Ausrufezeichen kein Popup mit der Fehlermeldung angezeigt, wie es normalerweise der Fall ist.

    – Das Ö

    23. Juli ’14 um 16:25


1641749106 4 Erstellen eines setError fur den Spinner
Kwex

Danke Gabor für deine fantastische Lösung. Um Ihren Standpunkt zu unterstützen, lautet meine Lösung so:

Benutzerdefinierter Adapter

    public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> {
        public RequiredSpinnerAdapter(Context context, int textViewResourceId,
                                      java.util.List<T> objects) {
            super(context, textViewResourceId, objects);
        }

        int textViewId = 0;

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            if (view instanceof TextView) {
                textViewId = view.getId();
            }
            return view;
        }

        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            View row = super.getView(position, convertView, parent);
            return (row);
        }

        public void setError(View v, CharSequence s) {
            if(textViewId != 0){
                TextView name = (TextView) v.findViewById(textViewId);
                name.setError(s);
            }
        }
    }

Adapter für Spinner verwenden

ArrayAdapter<String> arrayAdapter = new RequiredSpinnerAdapter<String>(PropertyAdd.this, R.layout.checked, status_arr);
    marketstatus_spinner.setAdapter(arrayAdapter);
    marketstatus_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                                   int arg2, long arg3) {

            // Put code here
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
           // Put code here
        }
    });

Auf Validierung prüfen

private boolean checkValidation() {
    if(marketstatus_spinner.getSelectedItem().toString().equals("")){
        RequiredSpinnerAdapter adapter = (RequiredSpinnerAdapter)marketstatus_spinner.getAdapter();
        View view = marketstatus_spinner.getSelectedView();
        adapter.setError(view, "Please select a value");

        return false;
    }
}

  • Eine Einschränkung beim Platzieren eines EditText hinter dem Spinner besteht darin, dass Teile des Fehlerprüfverhaltens nicht funktionieren. Obwohl das rote Ausrufezeichen für einen Fehler angezeigt wird, wird beim Klicken auf das Ausrufezeichen kein Popup mit der Fehlermeldung angezeigt, wie es normalerweise der Fall ist.

    – Das Ö

    23. Juli ’14 um 16:25


1641749106 909 Erstellen eines setError fur den Spinner
Yury

Ich denke, Spinner ist nicht der richtige Ort für diese Methode. Im Falle von Spinner sollten Sie einen Wert auswählen und die Werte im Spinner sollten auf der Ebene Ihres Adapters gefiltert werden. Somit kann ein Benutzer nur die Werte auswählen, die sich im Spinner befinden.

  • Ich stimme zu, aber in einem Szenario, in dem 0 Element ein “Select..” ist, was dort möglich ist, wäre der setError erforderlich, wenn die Benutzerauswahl auf Index 0 bleibt

    – Bojan

    16. Okt ’13 um 10:49

.

228780cookie-checkErstellen eines setError() für den Spinner

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy