web-dev-qa-db-ja.com

TextInputLayoutエラー右揃え

TextInputLayoutで囲まれたEditTextがあります。 EditTextの下にエラーを表示したいのですが、画面の右端に揃えています。

これは私が現在持っているものです: Text Input Layout

エラーは次のように表示されます: Error right now

私がそれをどのように見せたいか: What I want

私のXMLはこれです:

        <Android.support.design.widget.TextInputLayout
            Android:id="@+id/text_input_email"
            style="@style/forgot_pass_text_inputlayout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@id/tv_enter_email_message"
            Android:layout_marginTop="@dimen/email_padding_top"
            Android:hintTextAppearance="@{forgotPasswordVM.hintTextAppearance}"
            Android:theme="@style/forgot_pass_til_state"
            app:error="@{forgotPasswordVM.email.textInputError}">

            <EditText
                Android:id="@+id/actv_email"
                style="@style/forgot_pass_edit_text"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="@string/email_address"
                Android:imeActionId="@+id/btn_submit"
                Android:imeOptions="actionSend"
                Android:inputType="textEmailAddress"
                Android:maxLines="1"
                Android:onEditorAction="@{forgotPasswordVM.onEditorAction}"
                Android:singleLine="true"
                app:binding="@{forgotPasswordVM.email.text}" />
        </Android.support.design.widget.TextInputLayout>

データバインディングを使用しています。

EditTextとTextInputLayoutの両方でAndroid:gravity="right"Android:layout_gravity="right"を設定してみました。どちらも私が望むようには機能しません。

テーマとスタイルに正しい重力を設定してみました。どちらもエラーには影響しません。

app:errorTextAppearance="@style/right_error"内で適用されるスタイルに正しい重力を試しました。これでもうまくいきません。

このリンク に続くAlignmentSpanでSpannableStringBuilderを使用して、プログラムでエラーを右にシフトしてみました。それでも私にはうまくいきません。

他に何を試すべきかわかりません。提案してください。

12
Rachit

おかげで マイクの答え 私は解決策を理解することができました。

カスタムクラスを作成しました:

public class CustomTextInputLayout extends TextInputLayout {

    public CustomTextInputLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setErrorEnabled(boolean enabled) {
        super.setErrorEnabled(enabled);

        if (!enabled) {
            return;
        }

        try {
            Field errorViewField = TextInputLayout.class.getDeclaredField("mErrorView");
            errorViewField.setAccessible(true);
            TextView errorView = (TextView) errorViewField.get(this);
            if (errorView != null) {
                errorView.setGravity(Gravity.RIGHT);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                params.gravity = Gravity.END;
                errorView.setLayoutParams(params);
            }
        }
        catch (Exception e) {
            // At least log what went wrong
            e.printStackTrace();
        }
    }
}

ここで、TextInputLayoutをCustomTextInputLayoutに置き換えただけです。チャームのように機能します。どうもありがとう マイク 。この答えをもっと信用できたらいいのにと思います。

12
Rachit

私のカスタムクラスはKotlinにあります

class CustomTextInputLayout(context: Context, attrs: AttributeSet) :
    TextInputLayout(context, attrs) {

    override fun setErrorEnabled(enabled: Boolean) {
        super.setErrorEnabled(enabled)

        if (!enabled) {
            return
        }

        try {
            val layout = this;
            val errorView : TextView = ((this.getChildAt(1) as ViewGroup).getChildAt(0) as ViewGroup).getChildAt(0) as TextView

            (layout.getChildAt(1) as ViewGroup).layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT
            (layout.getChildAt(1) as ViewGroup).getChildAt(0).layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT

            errorView.gravity = Gravity.END

        } catch (e: Exception) {
            e.printStackTrace()
        }

    }
}
3
Berkay92

選択した回答が機能しない場合。別の解決策は以下のとおりです。

以下のようにカスタムクラスを作成します。

public class CustomTextInputLayout extends TextInputLayout
{

public CustomTextInputLayout(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

@Override
public void setErrorEnabled(boolean enabled)
{
    super.setErrorEnabled(enabled);

    if (!enabled)
    {
        return;
    }

    try
    {
        TextView errorView = this.findViewById(R.id.textinput_error);
        FrameLayout errorViewParent = (FrameLayout) errorView.getParent();
        errorViewParent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
        errorView.setGravity(Gravity.CENTER); // replace CENTER  with END or RIGHT
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

次に、カスタムTextInputLayoutを次のように作成します。

 <CustomTextInputLayout
    Android:id="@+id/til_first_name"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_margin="@dimen/activity_horizontal_margin"
    app:layout_constraintBottom_toTopOf="@+id/til_last_name">

    <EditText
        Android:id="@+id/et_first_name"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:hint="@string/first_name"
        Android:gravity="right"
        />

</CustomTextInputLayout>

その後、コードを次のように初期化します。

private CustomTextInputLayout tilFirstName;
tilFirstName = view.findViewById(R.id.til_first_name);

おめでとう!あなたはあなたが必要としたことをしました。