TextInputLayout的错误消息文本被切断

时间:2018-11-29 16:03:43

标签: android android-view

嘿,有人知道为什么会发生这种情况(如图所示)吗? 小米MiA1会发生这种情况,而诺基亚7.1可以正常工作。

Cutted of error hint

我的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并不重要,因为我只使用视图的颜色进行操作

7 个答案:

答案 0 :(得分:3)

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

textInputLayout.setError(null); textInputLayout.setErrorEnabled(false);
textInputLayout.setError("Error Message");

答案 1 :(得分:2)

this document

Layout inspector preview of TextInputLayout

Layout Inspector显示即使该错误有一定空间,它也不会全部绘制视图。 LinearLayouts(和一个简单的FrameLayout)中的所有内容都没有,所以没有任何东西可以重叠它,paddings设置为0,没有代码更改高度或实现中可疑的东西,所以我不知道这是什么。这种行为的原因。

尽管我找到了一些可行的解决方案。您需要在map中找到一个视图错误(ID为TextInputLayout),并向其中添加一些小填充。我通过扩展TextInputLayout并将此类代码添加到init中来完成此操作。

textinput_error

问题跟踪器已经存在问题-Views hierarchy,所以希望Google有一天会解决此问题。

答案 2 :(得分:1)

我通过保存并重新分配LayoutParams解决了该问题:

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

答案 3 :(得分:0)

我通过将错误字体的大小增加到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)可能对其他方面有所帮助。

答案 4 :(得分: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);

答案 5 :(得分:0)

正如某些人已经指出的那样,这是一个已知的错误。参见https://issuetracker.google.com/issues/116747167

我通过执行以下操作解决了这一问题(请注意,以下代码是Kotlin,所以!=适用于字符串):

if(myInputLayout.error != error){
   myInputLayout.error = error
}

答案 6 :(得分: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")