如何使TextInputLayout中的错误消息出现在中心

时间:2015-11-30 12:16:50

标签: android android-textinputlayout android-gravity

目前看起来与此布局相符:

CopyFromRecordset

如何设置错误信息“密码必须至少为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">

6 个答案:

答案 0 :(得分:6)

我想知道是否有任何方法可以从框架中处理它...似乎没有。

但TextInputLayout的工作方式是:
- 当用户触摸时,提示将在EditText 顶部显示
- 错误消息将在TextInputLayout
下显示并对齐以启动。

由于提示和错误消息之间的不对齐,我的EditText有40dp的left_margin。所以现在,我从EditText中删除了left_margin 40dp并将其应用于TextInputLayout本身,所以它现在看起来很好。

经验教训:-)是否必须将任何边距应用于EditText,如果可能的话,更好的相同,可以应用于TextInputLayout以保持正确放置提示和错误消息。

答案 1 :(得分:1)

这里的解决方案总是将错误消息集中在一起,无论TextInputLayout有多大。

您从 TextInputLayout 创建一个继承的类。然后覆盖ShowError(字符串文本,Drawable图标)方法。如果调用错误,则将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);
                }
            }
        }
    }

答案 2 :(得分:1)

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)
}}

答案 3 :(得分:0)

我通过设置错误视图的起始边距来实现它。您可以在下面看到我setError组件的TextInputLayout方法的覆盖版本。

@Override
public void setError(@Nullable CharSequence errorText) {
    // allow android component to create error view
    if (errorText == null) {
        return;
    }
    super.setError(errorText);
    // find this error view and calculate start margin to make it look like centered
    final TextView errorTextInput = (TextView) findViewById(R.id.textinput_error);
    errorTextInput.measure(0, 0);
    int errorWidth = errorTextInput.getMeasuredWidth();
    int layoutWidth = getWidth();
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) errorTextInput.getLayoutParams();
    params.setMarginStart((layoutWidth - errorWidth) / 2);
    errorTextInput.setLayoutParams(params);
}

答案 4 :(得分:0)

@Override
public void setErrorEnabled(boolean enabled) {
    super.setErrorEnabled(enabled);
    if (!enabled)
        return;
    try {
        setErrorGravity(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void setErrorGravity(ViewGroup view) throws Exception {
    for (int i = 0; i < view.getChildCount(); i++) {
        View errorView = view.getChildAt(i);
        if (errorView instanceof TextView) {
            if (errorView.getId() == com.google.android.material.R.id.textinput_error) {
                FrameLayout errorViewParent = (FrameLayout) errorView.getParent();
                errorViewParent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
                ((TextView) errorView).setGravity(Gravity.RIGHT);
                ((TextView) errorView).setTypeface(FontUtils.getTypeFace(view.getContext(), FontUtils.FONT_NAZANIN_TAR));
            }
        }
        if (errorView instanceof ViewGroup) {
            setErrorGravity((ViewGroup) errorView);
        }
    }
}

答案 5 :(得分:0)

嗨,如果您使用的是最新版本的材料设计(v 1.2 及更高版本),则必须使用这种方式:(我将重力设置为结束以支持 rtl) 谢谢@Emmanuel Guerra

class MyTextInputLayout : TextInputLayout {

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttrs: Int) : super(context, attrs, defStyleAttrs)

    override fun setErrorEnabled(enabled: Boolean) {
        super.setErrorEnabled(enabled)
        if (!enabled) {
            return
        }
        try {
            changeTextAlignment(com.google.android.material.R.id.textinput_error, View.TEXT_ALIGNMENT_VIEW_END)
            val errorView: ViewGroup = this.getChildAt(1) as LinearLayout

            val params: LinearLayout.LayoutParams = errorView.layoutParams as LinearLayout.LayoutParams

            params.gravity = Gravity.END

            errorView.layoutParams = params
            //errorView.setPadding(0, 0, 0, 0) //use this to remove error text padding
            //setErrorIconDrawable(0)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }


    private fun changeTextAlignment(textViewId: Int, alignment: Int) {
        val textView = findViewById<TextView>(textViewId)
        textView.textAlignment = alignment
    }
}