8

現在、このレイアウトに添付されているように見えます:

<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" で試しましたが、うまくいきませんでした。

ここに画像の説明を入力


EditText を含む EDITレイアウト:

<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

7 に答える 7

5

フレームワークからそれを処理する方法があるかどうか知りたかった..いいえ.

ただし、TextInputLayout の動作は次のとおりです。
-ユーザーが EditText に触れると、ヒントがEditText の上に表示されます。
-エラー メッセージは、TextInputLayout のすぐ下に表示され、先頭に配置されます。

ヒントとエラーメッセージのずれが原因で、EditText に 40 dp の left_margin がありました。とりあえず、EditText から left_margin 40dp を削除し、TextInputLayout 自体に同じように適用したので、問題なく表示されます。

教訓 :-) EditText にマージンを適用する必要がある場合は、可能であれば、同様に TextInputLayout に適用して、ヒントとエラー メッセージが適切に配置されるようにすることができます。

于 2015-11-30T13:11:57.300 に答える
3
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)
}}
于 2018-08-02T06:55:18.553 に答える
1

ここでは、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);
                }
            }
        }
    }
于 2017-01-03T13:00:38.973 に答える
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);
        }
    }
}
于 2019-11-05T10:36:22.903 に答える