有没有办法强制TextInputLayout错误消息占用一行?
我尝试将app:errorTextAppearance="@style/error_appearance"
放在TextInputLayout上,其error_appearance样式包含:
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
<item name="android:inputType">text</item>
它不起作用。然而,改变颜色是有效的。我不明白,mErrorView只是一个TextView,它应该可以工作。
答案 0 :(得分:2)
错误文本仅为TextView
,但TextAppearance
样式仅影响文本本身,而不影响TextView
如何设置(除了errorTextAppearance
由于这些属性的尺寸考虑因素)。您可以使用ellipsize
设置错误文字的大小,字体,颜色等,但不能在{{maxLines
上设置View
或TextView
1}}。
由于错误只是View
,我们可以自己设置所需的属性。我们可以迭代TextInputLayout
的所有后代TextInputLayout
,但这有点笨拙,并且不是很可靠,因为TextView
可以容纳更多不是EditText
的{{1}}。TextView
。我通常更喜欢反思这样的事情。
使用setErrorEnabled()
调用true
方法时会创建错误false
,如果使用TextInputLayout
调用方法,则其字段无效。不是尝试从外部跟踪所有这些,而是更容易子类TextView
,并在创建时在错误setErrorEnabled()
上设置所需的属性。请注意,在实例化期间会自动调用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();
}
}
}
,因此无需显式调用该方法来启用此功能。
例如:
TextInputLayout
这是<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>
的替代品,您可以像在常规课程中一样在布局中使用它。
TextView
为了完整性&#39;为了找到TextInputLayout
的第一个TextInputLayout
子项,并设置所需的属性,我将包括以下内容(可用于代替上述方法)。在基本的默认TextView
中,错误TextInputLayout
应成为第一个找到的错误。如果您想要进行额外检查,可以将找到的子项与该集合中的文本作为// 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
ViewGroup
是findErrorView()
,因此您可以直接使用您的实例(在子类内)或外部调用TextView
。但仍然要注意,错误TextView
在错误启用时会重新创建,并在禁用时销毁。这些设置将不会持续存在。
N.B。 - 在撰写此答案时,错误TextView
在创建时未分配ID,因此需要上面的反射和迭代方法。但是,正如kjurkovic中提到their answer,在最新版本的支持库中,错误R.id.textinput_error
现在已分配了TextView
的ID。这排除了对本答案中描述的方法的需求,尽管样式解释和TextView
实例化和归零的描述仍然是相关的。
我还要提到,计数器R.id.textinput_counter
现在也被分配了一个<div [innerHTML]="myComponentsTemplate"></div>
的ID,以防有人在这篇文章中发现有关该信息的信息。
答案 1 :(得分:0)
您可以按ID
获取错误TextViewTextView errorView = textInputLayout.findViewById(R.id.textinput_error);
errorView.setMaxLines(1);
errorView.setSingleLine(true);