TextInputLayout的错误信息文本被截断了。

10

有人知道为什么会出现这个问题吗?(见图片)
小米MiA1手机会出现此问题,而在诺基亚7.1正常。

截断的错误提示

我的XML视图布局:

FrameLayout - root
 ScrollView
  RelativeLayout
   <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/til_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/profile.EMAIL"
                android:theme="@style/TextInputLayoutTheme"
                android:margin="16dp"
                android:paddingBottom="8dp"
                app:layout_constraintTop_toBottomOf="@+id/phone_wrapper"
                >

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:textSize="16sp"
                    android:textColor="@color/darkTextColor"
                    android:imeOptions="actionDone"
                    tools:text="Email"
                    />
            </com.google.android.material.textfield.TextInputLayout>

我认为在这里使用TextInputLayoutTheme是不相关的,因为我只是操作视图的颜色。


2
我认为 android:paddingBottom="8dp" 是罪魁祸首。 - Pankaj Kumar
Pankaj Kumar - 在这种情况下不适用。 - murt
有没有解决方案?我也遇到了同样的问题。 - Shabbir Dhangot
1
通过调用textInputPhone.setErrorEnabled(true)解决了@murt的问题。 - Shabbir Dhangot
7个回答

25

如果您在TextInputLayout上多次设置错误消息,则错误消息文本会被截断。因此,每次设置TextInputLayout错误消息文本时,请先将其设置为null。

textInputLayout.setError(null); textInputLayout.setErrorEnabled(false);
textInputLayout.setError("错误消息");


3
解决方案有效!但是当我开始编辑电子邮件字段时,会跳出错误消息。 - Dinesh
哈哈!有趣的解决方案) - Volodymyr R.tmnko
3
@Dinesh - 可能有点晚了,但要避免文本跳动的问题,只有在当前错误与新错误不同时才设置错误,像这样:if(myInputLayout.error != error) { myInputLayout.error = error } - EAlgekrans

7

TextInputLayout的布局检查器预览

视图层次结构

布局检查器显示,即使有一些空间用于错误提示,它也不会在所有空间中绘制视图。所有内容都在LinearLayouts(和一个简单的FrameLayout)中,因此没有任何重叠的可能性,填充设置为0,在实现中没有更改高度或其他可疑的代码,因此我不知道这种行为的原因。

尽管我找到了一些解决方案,它是有效的。您需要在TextInputLayout中找到一个持有错误的视图(带有id textinput_error),并向其添加一些小填充。我通过扩展TextInputLayout并将此代码添加到init中完成了此操作。

val errorTV = findViewById<TextView>(R.id.textinput_error)
errorTV.updatePadding(top = 4)

在问题跟踪器上已经有一个问题 - https://issuetracker.google.com/issues/116747167,所以让我们希望 Google 有一天能够解决它。


2

我通过保存和恢复LayoutParams解决了这个问题:

最初的回答

    final ViewGroup.LayoutParams params = textInputLayout.getLayoutParams();
    textInputLayout.setError(errorMessage);
    textInputLayout.setLayoutParams(params);

1
正如一些人已经指出的那样,这是一个已知的错误。请参见https://issuetracker.google.com/issues/116747167
我通过类似以下代码的方式解决了这个问题(注意下面的代码是Kotlin,所以!=适用于字符串):
if(myInputLayout.error != error){
   myInputLayout.error = error
}

1

我通过将错误字体大小增加到14sp(原来是12sp)来解决了该问题。

<com.google.android.material.textfield.TextInputLayout
        [...] 
        app:errorTextAppearance="@style/MyProfile.Error">

<style name="MyProfile.Error" parent="TextAppearance.Design.Error">
        <item name="android:textSize">14sp</item>
</style>

尽管Shabbir Dhangot说过,设置TIL.setErrorEnabled(true)可能对其他人有所帮助。

0

我知道这不是最好的解决方案,但你可以在错误信息的开头添加一个\n

例如,如果你的错误是Error,只需将其更改为\nError

如果你想要更改\n的大小,可以使用:

String newLine = "\n";
String errorMessage = "Error";

SpannableString spannableErrorMessage = new SpannableString(newLine  + errorMessage );
spannableName.setSpan(new TextAppearanceSpan(activity, R.style.my_style),0,a.length(), 0);
spannableName.setSpan(new RelativeSizeSpan(2.0f), a.length(), a.length() + 1, 0);

0
你可以使用这个 Kotlin 扩展:
/**
 * Fix a bug with [TextInputLayout] that cut the error text when setting the same text twice.
 */
fun TextInputLayout.setFixedError(errorTxt: CharSequence?) {
    if (error != errorTxt) {
        error = errorTxt
    }
}

使用方法:

yourTextInput.setFixedError("Your error text")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接