TextInputLayout 错误消息大小

and*_*rei 3 android text-size android-textinputlayout

有没有办法强制 TextInputLayout 错误消息采用单行?

我尝试将app:errorTextAppearance="@style/error_appearance"包含以下内容的 error_appearance 样式放置在 TextInputLayout 上:

<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
<item name="android:inputType">text</item>
Run Code Online (Sandbox Code Playgroud)

它不起作用。然而,改变颜色是有效的。我不明白,mErrorView 只是一个 TextView,它应该可以工作。

TextInputLayout 错误信息

Mik*_* M. 7

确实,错误是 a TextView,但样式TextAppearance仅影响文本,而不影响View文本所在的位置。maxLinesellipsize属性属于TextView,因此它们将在样式中被忽略TextAppearance,该样式需要textColortextSizetypeface等属性。1

\n

知道了这一点,我们只需要找到一种方法来在错误上设置这些属性的值TextViewkjurkovic 对这个问题的回答展示了如何在代码中执行此操作,对于当前版本的TextInputLayout. 2事实证明,我们还有一种方法可以在布局 XML 中执行此操作,这对于某些人来说可能更可取。

\n

该错误TextView是用TextInputLayout\'s实例化的Context,我们实际上可以在布局 XML 中修改它,在某种程度上,可以使用 属性android:theme。使用具有此属性的覆盖,我们可以使该Context主题本质上具有\xe2\x80\x93,即包含我们所需属性值的 s \xe2\x80\x93android:textViewStyle的基本设置。TextView

\n

在您的主题/样式资源 XML 中:

\n
<style name="ThemeOverlay.TextInputLayout.TextView" parent="">\n    <item name="android:textViewStyle">@style/Widget.TextView.SingleLineEllipsized</item>\n</style>\n\n<style name="Widget.TextView.SingleLineEllipsized" parent="">\n    <item name="android:maxLines">1</item>\n    <item name="android:ellipsize">end</item>\n</style>\n
Run Code Online (Sandbox Code Playgroud)\n

<TextInputLayout>布局 XML 中,只需添加android:theme属性:

\n
<com.google.android.material.textfield.TextInputLayout\n    android:id="@+id/text_input_layout_phone"\n    android:layout_width="match_parent"\n    android:layout_height="wrap_content"\n    android:hint="Phone number"\n    android:theme="@style/ThemeOverlay.TextInputLayout.TextView">\n\n    <com.google.android.material.textfield.TextInputEditText\n        android:id="@+id/edit_text_phone"\n        android:layout_width="match_parent"\n        android:layout_height="wrap_content" />\n\n</com.google.android.material.textfield.TextInputLayout>\n
Run Code Online (Sandbox Code Playgroud)\n

虽然现在的TextInputLayout设计细节与原来有所不同,但我们可以看到maxLinesellipsize设置已经起作用:

\n

在此输入图像描述

\n
\n

这种方法的主要警告是所有TextInputLayout\ 的内部TextView都将具有这些基本属性值。目前,除了错误之外,这些还包括助手、计数器、前缀和后缀。

\n
    \n
  • 帮助器占据与错误相同的位置,因此,如果您希望在其中一个上使用单线和椭圆形,那么您很可能也希望在另一个上使用它,如果您正在使用它的话。
  • \n
  • 计数器已经被设置为单行,并且ellipsize只有当计数器变得比 更宽时,无关的才会起作用EditText
  • \n
  • 无论如何,前缀和后缀本质上都是单行的。
  • \n
\n

如果其中任何一个是不需要的,那么 kjurkovic 的findViewById()演示应该适用于所有这些TextViews, 3,但您必须确保首先设置相应的文本,因为TextViews 是根据需要实例化的。

\n
\n

1您可以在平台的资源文件TextAppearance中找到有效属性的完整列表。我不相信有任何文档或开发人员页面涵盖它;至少,以前没有。res/values/attrs.xml

\n

2的第一个版本TextInputLayout没有为内部TextViews 分配 ID,因此需要反射才能直接引用错误TextView,或者笨拙地搜索内部层次结构。我还没有在这些古老版本上测试过主题覆盖解决方案,但如果出于某种原因您坚持使用一个解决方案并且这不起作用,则此答案的先前修订版为您提供了其他选项。

\n

3顺便说一句,所有这些的 ID 如下:R.id.textinput_errorR.id.textinput_helper_textR.id.textinput_counterR.id.textinput_prefix_text、 和R.id.textinput_suffix_text

\n


kju*_*vic 7

您可以通过 id 获取错误 TextView

TextView errorView = textInputLayout.findViewById(R.id.textinput_error);
errorView.setMaxLines(1);
errorView.setSingleLine(true);
Run Code Online (Sandbox Code Playgroud)