Entwerfen Sie Android EditText so, dass die von Google beschriebene Fehlermeldung angezeigt wird


151

Ich brauche eine EditText, die so aussieht onError:

Geben Sie hier die Bildbeschreibung ein

Das Aufrufen von onError sieht stattdessen so aus:

Geben Sie hier die Bildbeschreibung ein

Hinweis: Die App läuft auf SDK 19 (4.4.2)

min SDK ist 1

Gibt es eine ähnliche Methode wie setError, die dies automatisch ausführt, oder muss ich den Code dafür schreiben?

Danke dir


1
Es ist unwahrscheinlich, dass Sie dies mit nur einem tun können EditText. Wahrscheinlicher ist, dass Sie etwas benötigen, das es umschließt EditTextoder auf andere Weise ergänzt. Siehe github.com/rengwuxian/MaterialEditText .
CommonsWare

Antworten:


330

Es ist nicht erforderlich, eine Drittanbieter-Bibliothek zu verwenden, da Google diese TextInputLayoutals Teil der Bibliothek eingeführt hat design-support-library.

Nach einem einfachen Beispiel:

Layout

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

</android.support.design.widget.TextInputLayout>

Hinweis: Wenn Sie app:errorEnabled="true"als Attribut für TextInputLayoutfestlegen, wird die Größe nicht geändert, sobald ein Fehler angezeigt wird. Dadurch wird der Platz im Grunde genommen blockiert.

Code

Um den Fehler unter EditTextanzuzeigen, müssen Sie nur #setErrordie TextInputLayout(NICHT das Kind EditText) anrufen :

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

Ergebnis

Bild zeigt den Bearbeitungstext mit der Fehlermeldung

Um den Fehler auszublenden und den Farbton zurückzusetzen, rufen Sie einfach an til.setError(null).


Hinweis

Um das zu verwenden TextInputLayout, müssen Sie Ihren build.gradleAbhängigkeiten Folgendes hinzufügen :

dependencies {
    compile 'com.android.support:design:25.1.0'
}

Festlegen einer benutzerdefinierten Farbe

Standardmäßig ist die Zeile von EditTextrot. Wenn Sie eine andere Farbe anzeigen müssen, können Sie den folgenden Code verwenden, sobald Sie anrufen setError.

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

Um es zu löschen, rufen Sie einfach die clearColorFilterFunktion wie folgt auf:

editText.getBackground().clearColorFilter();

3
Ja ! Das ist es ! Wie macht man die Linie rot?
kmn

3
@kmn Wenn Sie die Linie rot machen, ist dies nicht sofort einsatzbereit. Sie müssen dies also selbst tun. Siehe meine Bearbeitung. In Bezug auf das Bewegen des Hinweises: Das ist afaik nicht möglich.
ReVerse

5
@Alessio Ich habe nur versucht zu sagen, dass es funktionieren sollte, wenn Sie AppCompatActivity erweitern. Trotzdem: Ab appcompat-v23 muss der colorFilter nicht mehr eingestellt werden, sobald Sie textInputLayout.setError("Error messsage")die Farbe des aufrufen, EditTextsollte rot werden. Um es zurückzusetzen, reicht es aus, anzurufen textInputLayout.setError(null).
ReVerse

3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);wird mit der neuesten Support-Bibliothek nicht mehr benötigt
Antoine Bolvy

13
Ich wollte nur beachten, da es sich um ein so kleines Detail handelt - ich hatte dieses Problem, indem ich setError auf dem EditText, nicht auf dem aufgerufen habe TextInputLayout. Ich sah diese Antwort und konnte immer noch nicht herausfinden, was ich ändern musste. Sehr leicht zu übersehen.
h_k

8

Anruf myTextInputLayout.setError()stattmyEditText.setError() .

Diese Container und Containments verfügen über doppelte Funktionen zum Festlegen von Fehlern. Die Funktionalität, die Sie benötigen, ist die eines Containers. Dafür könnten Sie jedoch eine minimale Version von 23 benötigen.


7

Sie EditTextsollten in ein eingewickelt seinTextInputLayout

<android.support.design.widget.TextInputLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tilEmail">

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:ems="10"
        android:id="@+id/etEmail"
        android:hint="Email"
        android:layout_marginTop="10dp"
        />

</android.support.design.widget.TextInputLayout>

Um eine gewünschte Fehlermeldung zu erhalten, setzen Sie error auf TextInputLayout

TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
if (error){
    tilEmail.setError("Invalid email id");    
}

Sie sollten die Abhängigkeit der Designunterstützungsbibliothek hinzufügen. Fügen Sie diese Zeile in Ihre Gradle-Abhängigkeiten ein

compile 'com.android.support:design:22.2.0'

4

Die Antwort von reVerse ist großartig, aber es wurde nicht darauf hingewiesen, wie der Tooltip für schwebende Fehler entfernt werden kann

Sie müssen edittext.setError(null)das entfernen.
Auch, wie jemand betonte, brauchen Sie nichtTextInputLayout.setErrorEnabled(true)

Layout

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />
</android.support.design.widget.TextInputLayout>

Code

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);

1
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");

7
setErrorEnabled nicht benötigt
JacksOnF1re

0

Wenn immer noch jemand den Fehler bei der Verwendung der in der Antwort erwähnten Google-Designbibliothek hat, verwenden Sie diese bitte wie von @h_k kommentiert.

Anstatt setError in TextInputLayout aufzurufen , verwenden Sie möglicherweise setError in EditText .


0
private EditText edt_firstName;
private String firstName;

edt_firstName = findViewById(R.id.edt_firstName);

private void validateData() {
 firstName = edt_firstName.getText().toString().trim();
 if (!firstName.isEmpty(){
//here api call for ....
}else{
if (firstName.isEmpty()) {
                edt_firstName.setError("Please Enter First Name");
                edt_firstName.requestFocus();
            } 
}
}

Wenn Sie eine alte Frage beantworten, ist Ihre Antwort für andere StackOverflow-Benutzer viel nützlicher, wenn Sie einen Kontext angeben, um zu erklären, wie Ihre Antwort hilft, insbesondere für eine Frage, für die bereits eine Antwort akzeptiert wurde. Siehe auch : Wie kann ich eine gute Antwort schreiben .
David Buck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.