Как сделать сообщение об ошибке в TextInputLayout появится в центре

В настоящее время он выглядит как в приложении с этим макетом:

<android.support.design.widget.TextInputLayout
    android:id="@+id/layoutCurrentPW"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    app:errorEnabled="true">

Как установить сообщение об ошибке "пароль должен быть не менее 8 символов" в центр тяжести ?
Я пробовал с android: gravity= "center", но это не сработало.

enter image description here

редактировать
Макет, включающий EditText:

<android.support.design.widget.TextInputLayout
    android:id="@+id/layoutCurrentPW"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    app:errorEnabled="true">

        <EditText
            android:id="@+id/editTextCurrentPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:gravity="center"
            android:hint="@string/current_password"
            android:inputType="textPassword"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/black" />
    </android.support.design.widget.TextInputLayout>

4 ответов


Я хотел знать, есть ли способ справиться с этим из фреймворка..кажется, нет.

но способ работы TextInputLayout:
- подсказка будет отображаться поверх EditText когда пользователь прикасается к нему.
- сообщения об ошибках будет показано просто под TextInputLayout и выровнены для начала.

У меня было 40dp left_margin для моего EditText из-за которого рассогласование между подсказкой и сообщением об ошибке. Так что сейчас, Я удалил left_margin 40dp из EditText и применил его к TextInputLayout, поэтому теперь он выглядит нормально.

урок: -) если какие-либо поля должны быть применены к EditText, лучше же, если это возможно, можно применить к TextInputLayout, чтобы сохранить подсказки и сообщения об ошибках, которые должны быть размещены правильно.


здесь решение, которое всегда центрирует errormessage независимо от того, насколько велик ваш TextInputLayout.

Вы делаете свой класс наследует С TextInputLayout. Затем переопределите метод ShowError(string text, Drawable icon). Если ошибка вызвана, вы центрируете textView с ошибкой.

    public class TextInputLayout_Center : TextInputLayout
    {
        public override void ShowError(string text, Android.Graphics.Drawables.Drawable icon)
        {
            base.ShowError(text, icon);

            centerErrorMessage(this);
        }

        void centerErrorMessage(ViewGroup view)
        {
            for (int i = 0; i < view.ChildCount; i++)
            {
                View v = view.GetChildAt(i);
                if (v.GetType() == typeof(TextView))
                {
                    v.LayoutParameters = new LayoutParams(ViewGroup.LayoutParams.MatchParent, v.LayoutParameters.Height);
                    ((TextView)v).Gravity = GravityFlags.CenterHorizontal;
                    ((TextView)v).TextAlignment = TextAlignment.Center;
                }
                if (v is ViewGroup)
                {
                    centerErrorMessage((ViewGroup)v);
                }
            }
        }
    }

я достиг этого, установив начальное поле для представления ошибки. Ниже вы можете увидеть мою переопределенную версию setError метод


class CenterErrorTextInputLayout(context: Context, attrs: AttributeSet) : TextInputLayout(context, attrs) {
override fun setErrorTextAppearance(resId: Int) {
    super.setErrorTextAppearance(resId)
    val errorTextView = this.findViewById<TextView>(R.id.textinput_error)
    val errorFrameLayout = errorTextView.parent as FrameLayout

    errorTextView.gravity = Gravity.CENTER
    errorFrameLayout.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
}}