TextInputLayoutで囲まれたEditTextがあります。 EditTextの下にエラーを表示したいのですが、画面の右端に揃えています。
私の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を使用して、プログラムでエラーを右にシフトしてみました。それでも私にはうまくいきません。
他に何を試すべきかわかりません。提案してください。
おかげで マイクの答え 私は解決策を理解することができました。
カスタムクラスを作成しました:
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に置き換えただけです。チャームのように機能します。どうもありがとう マイク 。この答えをもっと信用できたらいいのにと思います。
私のカスタムクラスは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()
}
}
}
選択した回答が機能しない場合。別の解決策は以下のとおりです。
以下のようにカスタムクラスを作成します。
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);
おめでとう!あなたはあなたが必要としたことをしました。