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>
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.
fügen die XML diese Linie Android holen können: single = "true" –
@MalikAbuQaoud schon versucht, und es funktioniert nicht. und singleLine ist jetzt veraltet – andrei
singleLIne funktioniert immer noch und es funktioniert mit mir, okay, dann versuchen, Ellipsen zu markieren –