2017-03-03 6 views
6

J'ai un EditText inclus dans un TextInputLayout. Je souhaite afficher des erreurs sous EditText, mais alignées à l'extrémité droite de l'écran.TextInputLayout Erreur aligner à droite

C'est ce que j'ai actuellement: Text Input Layout

L'erreur est affiché comme ceci: Error right now

Ce que je veux ressembler: What I want

Mon XML est la suivante:

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

Je suis utilisant la liaison de données.

J'ai essayé de définir android:gravity="right" et android:layout_gravity="right" à la fois sur EditText et TextInputLayout. Ni fonctionne comme je le veux.

J'ai essayé de régler la gravité dans le thème ainsi que le style. Aucun effet sur l'erreur.

J'ai essayé la gravité juste sur le style qui est appliqué dans app:errorTextAppearance="@style/right_error". Même cela ne fonctionne pas.

J'ai essayé par programmation de déplacer l'erreur vers la droite en utilisant un SpannableStringBuilder avec un AlignmentSpan suivant this link. Même cela ne fonctionne pas pour moi.

Je ne sais pas quoi d'autre à essayer. Veuillez suggérer.

+2

Vous pouvez essayer d'utiliser l'une des options de [ma réponse ici] (http://stackoverflow.com/a/40706872) pour obtenir l'erreur 'TextView', et appeler' setGravity (Gravity.RIGHT) ' . Je ne l'ai pas testé, mais IIRC, l'erreur 'TextView' a une largeur' match_parent', donc il devrait aligner son texte comme vous le décrivez. –

Répondre

6

Donc, grâce à Mike's answer, j'ai été en mesure de comprendre la solution.

J'ai créé une classe personnalisée:

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

Maintenant, je simplement remplacé mon TextInputLayout avec le CustomTextInputLayout. Fonctionne comme un charme. Merci beaucoup Mike. J'aimerais pouvoir vous remercier davantage pour cette réponse.

+0

salut, im essayant d'afficher le message d'erreur sur le coin edittext et aligné à droite, une idée de comment je fais ça? – ViVekH

+0

@ViVekH, pouvez-vous expliquer un peu plus ce que vous voulez? – Rachit