2016-11-20 2 views
0

Gibt es eine Möglichkeit, die TextInputLayout-Fehlermeldung zu erzwingen, eine einzelne Zeile zu nehmen?TextInputLayout Fehlermeldung Größe

Ich versuchte app:errorTextAppearance="@style/error_appearance" auf dem TextInputLayout mit dem error_appearance Stil zu platzieren enthält:

<item name="android:maxLines">1</item> 
<item name="android:ellipsize">end</item> 
<item name="android:inputType">text</item> 

und es funktioniert nicht. Das Ändern der Farbe funktioniert jedoch. Ich verstehe es nicht, das mErrorView ist nur ein TextView, es sollte funktionieren.

TextInputLayout error message

+0

fügen die XML diese Linie Android holen können: single = "true" –

+0

@MalikAbuQaoud schon versucht, und es funktioniert nicht. und singleLine ist jetzt veraltet – andrei

+0

singleLIne funktioniert immer noch und es funktioniert mit mir, okay, dann versuchen, Ellipsen zu markieren –

Antwort

1

Es ist wahr, die der Fehlertext nur TextView, sondern ein TextAppearance Stil wirkt sich nur der Text selbst, nicht, wie die TextView es (abgesehen zu diesen Attributen aufgrund von Größenüberlegungen) legt. Sie können die Größe, Schriftart, Farbe usw. des Fehlertextes mit der errorTextAppearance einstellen, aber Sie können die ellipsize oder maxLines über die View damit nicht einstellen.

Da der Fehler nur ein TextView ist, können wir nur die gewünschten Attribute selbst setzen. Wir könnten über alle Nachfahren View s der TextInputLayout iterieren, aber das ist ein wenig unhandlich und ist nicht sehr zuverlässig, da die TextInputLayout könnte mehr als eine TextView halten, die nicht seine EditText ist. Normalerweise bevorzuge ich Reflektionen für solche Dinge.

Der Fehler TextView erstellt wird, wenn das Verfahren mit setErrorEnabled()true genannt wird, und dessen Feld zunichte gemacht wird, wenn das Verfahren mit false genannt wird. Anstatt alles extern zu verfolgen, wäre es einfacher, die Unterklasse TextInputLayout zu entfernen und die gewünschten Attribute für den Fehler TextView beim Erstellen festzulegen. Beachten Sie, dass setErrorEnabled() automatisch während der Instantiierung aufgerufen wird. Daher müssen Sie die Methode nicht explizit aktivieren, um dies zu aktivieren.

Zum Beispiel:

public class CustomTextInputLayout extends TextInputLayout { 

    public CustomTextInputLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public void setErrorEnabled(boolean enabled) { 
     super.setErrorEnabled(enabled); 

     if (!enabled) { 
      return; 
     } 

     try { 
      Field errorViewField = TextInputLayout.class.getDeclaredField("mErrorView"); 
      errorViewField.setAccessible(true); 
      TextView errorView = (TextView) errorViewField.get(this); 
      if (errorView != null) { 
       errorView.setMaxLines(1); 
       errorView.setEllipsize(TextUtils.TruncateAt.END); 
      } 
     } 
     catch (Exception e) { 
      // At least log what went wrong 
      e.printStackTrace(); 
     } 
    } 
} 

Dies ist ein Drop-in-Ersatz für TextInputLayout, und Sie können es in Ihrem Layout verwenden, gerade wie Sie die reguläre Klasse.

<com.mycompany.myapp.CustomTextInputLayout 
    android:id="@+id/til" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

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

</com.mycompany.myapp.CustomTextInputLayout> 

screenshot


Der Vollständigkeit halber werde ich die folgenden Angaben enthalten, die an die Stelle des oben genannten Verfahrens verwendet werden kann, die erste TextView Kind eines TextInputLayout finden und legen Sie die gewünschten Attribute fest. In einer Grundeinstellung, TextInputLayout, sollte der Fehler TextView als erster gefunden werden. Wenn Sie eine zusätzliche Überprüfung wünschen, können Sie den Text des gefundenen untergeordneten Elements mit dem als Fehler auf der TextInputLayout festgelegten vergleichen.

// Returns true if found 
private static boolean findErrorView(ViewGroup vg) { 
    final int count = vg.getChildCount(); 
    for (int i = 0; i < count; ++i) { 
     final View child = vg.getChildAt(i); 
     if(child instanceof ViewGroup) { 
      if(findErrorView((ViewGroup) child)) { 
       return true; 
      } 
     } 
     else if (child.getClass().equals(TextView.class)) { 
      setAttributes((TextView) child); 
      return true; 
     } 
    } 
    return false; 
} 

private static void setAttributes(TextView t) { 
    t.setMaxLines(1); 
    t.setEllipsize(TextUtils.TruncateAt.END); 
} 

TextInputLayout ist ein ViewGroup, so dass Sie nur findErrorView() direkt mit Ihrer Instanz von so nennen kann, entweder innerhalb einer Unterklasse oder extern. Beachten Sie jedoch, dass der Fehler TextView immer dann neu erstellt wird, wenn der Fehler aktiviert ist, und bei Deaktivierung zerstört wird. Diese Einstellungen bleiben nicht bestehen.

+1

Alter, du bist ein Genie .. Arbeitete wie ein Charme .. Vielen Dank Mann. – Rachit

0

Sie Fehler Textview von id

TextView errorView = textInputLayout.findViewById(R.id.textinput_error); 
errorView.setMaxLines(1); 
errorView.setSingleLine(true);