TextInputLayout错误消息大小

时间:2016-11-20 16:00:08

标签: android text-size android-textinputlayout

有没有办法强制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,它应该可以工作。

TextInputLayout error message

2 个答案:

答案 0 :(得分:2)

错误文本仅为TextView,但TextAppearance样式仅影响文本本身,而不影响TextView如何设置(除了errorTextAppearance由于这些属性的尺寸考虑因素)。您可以使用ellipsize设置错误文字的大小,字体,颜色等,但不能在{{maxLines上设置ViewTextView 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

screenshot

为了完整性&#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

ViewGroupfindErrorView(),因此您可以直接使用您的实例(在子类内)或外部调用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

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