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,它应该可以工作。
确实,错误是 a TextView,但样式TextAppearance仅影响文本,而不影响View文本所在的位置。maxLines和ellipsize属性属于TextView,因此它们将在样式中被忽略TextAppearance,该样式需要textColor、textSize、typeface等属性。1
知道了这一点,我们只需要找到一种方法来在错误上设置这些属性的值TextView。kjurkovic 对这个问题的回答展示了如何在代码中执行此操作,对于当前版本的TextInputLayout. 2事实证明,我们还有一种方法可以在布局 XML 中执行此操作,这对于某些人来说可能更可取。
该错误TextView是用TextInputLayout\'s实例化的Context,我们实际上可以在布局 XML 中修改它,在某种程度上,可以使用 属性android:theme。使用具有此属性的覆盖,我们可以使该Context主题本质上具有\xe2\x80\x93,即包含我们所需属性值的 s \xe2\x80\x93android:textViewStyle的基本设置。TextView
在您的主题/样式资源 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>\nRun Code Online (Sandbox Code Playgroud)\n在<TextInputLayout>布局 XML 中,只需添加android:theme属性:
<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>\nRun Code Online (Sandbox Code Playgroud)\n虽然现在的TextInputLayout设计细节与原来有所不同,但我们可以看到maxLines,ellipsize设置已经起作用:

这种方法的主要警告是所有TextInputLayout\ 的内部TextView都将具有这些基本属性值。目前,除了错误之外,这些还包括助手、计数器、前缀和后缀。
ellipsize只有当计数器变得比 更宽时,无关的才会起作用EditText。如果其中任何一个是不需要的,那么 kjurkovic 的findViewById()演示应该适用于所有这些TextViews, 3,但您必须确保首先设置相应的文本,因为TextViews 是根据需要实例化的。
1您可以在平台的资源文件TextAppearance中找到有效属性的完整列表。我不相信有任何文档或开发人员页面涵盖它;至少,以前没有。res/values/attrs.xml
2的第一个版本TextInputLayout没有为内部TextViews 分配 ID,因此需要反射才能直接引用错误TextView,或者笨拙地搜索内部层次结构。我还没有在这些古老版本上测试过主题覆盖解决方案,但如果出于某种原因您坚持使用一个解决方案并且这不起作用,则此答案的先前修订版为您提供了其他选项。
3顺便说一句,所有这些的 ID 如下:R.id.textinput_error、R.id.textinput_helper_text、R.id.textinput_counter、R.id.textinput_prefix_text、 和R.id.textinput_suffix_text。
您可以通过 id 获取错误 TextView
TextView errorView = textInputLayout.findViewById(R.id.textinput_error);
errorView.setMaxLines(1);
errorView.setSingleLine(true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4266 次 |
| 最近记录: |