EditText setError est hors de propos dans BottomSheetDialog

Je suis confronté à un problème avec la position de l'indicateur d'erreur de mon EditText lors de l'appel de editText.setError("...") .

Comme vous pouvez le voir dans la capture d'écran, j'utilise BottomSheetDialog avec un EditText intérieur de celui-ci. Lorsque j'affiche l'indicateur d'erreur, le texte est complètement hors-sujet. Il semble que le dialogue «pense» qu'il soit en plein écran, alors qu'il ne l'est pas.

  • Comment ajouter des fragments par programme dans relativelayout
  • Android Hide Soft Keyboard de EditText sans perdre le curseur
  • Quel événement est déclenché après que toutes les vues sont complètement dessinées?
  • Change Theme.Dialog pour ressembler à Theme.Light.Dialog dans Android
  • Android Resource Qualifiers -sw # dp vs -w # dp
  • Comment obtenir l'ID de la vue enfant cliquée de manière dynamique sur LinearLayout?
  • Entrez la description de l'image ici

    C'est mon fichier de mise en page de boîte de dialogue (phone_dialog.xml):

     <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:orientation="vertical"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:gravity="center" android:padding="@dimen/padding_layout_normal" android:text="@string/dialog_title_edit_phone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/etPhone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:gravity="center" android:inputType="phone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvTitle"/> <Button android:id="@+id/btnSavePhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="0dp" android:layout_marginRight="0dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/etPhone"/> </android.support.constraint.ConstraintLayout> 

    Mon fichier de mise en page d'activité (activity_contacts.xml):

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/rvContacts" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> 

    C'est ainsi que je montre la boîte de dialogue de mon Activity :

     PhoneBottomDialog dialog = new PhoneBottomDialog(Context); dialog.show(); 

    C'est ma classe PhoneBottomDialog :

     public class PhoneBottomDialog extends BottomSheetDialog { public PhoneBottomDialog(Context context) { super(context); View view = getLayoutInflater().inflate(R.layout.phone_dialog, null); setContentView(view); // additional setup below this... } // ... } 

    Je n'effectue aucune autre disposition dans mon PhoneButtomDialog personnalisé. La modification de la disposition racine de ma boîte de dialogue vers RelativeLayout ou LinearLayout ainsi que l'ajout d'une ScrollView n'ont rien changé. Ce n'est pas non plus un problème de périphérique ou de version spécifique de Android, car le problème se produit sur tous mes appareils de test allant de Android 5.0 à 7.1, il se produit également sur l'émulateur.

    Est-ce que quelqu'un a une idée de la raison pour laquelle cela se produit?

  • Comment cacher l'emplacement actuel dans Google Map?
  • Supprimez le filtre de EditText dans Android?
  • Modification de la couleur des marqueurs - Google Map V2 Android
  • Pourquoi le clavier logiciel s'affiche-t-il ou non lorsqu'une activité démarre?
  • Android + google map api v2 + emplacement actuel
  • Comment dessiner un triangle rempli dans la toile Android?
  • 3 Solutions collect form web for “EditText setError est hors de propos dans BottomSheetDialog”

    Vous pouvez utiliser TextInputLayout et à l'intérieur, vous pouvez définir Edit Text .

    J'ai fait quelques modifications à l'intérieur de votre phone_dialog.xml .

    Phone_dialog.xml

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="300dp" android:layout_gravity="bottom" android:background="@android:color/holo_blue_light" android:padding="10dp" app:behavior_hideable="true" app:behavior_peekHeight="60dp" app:layout_behavior="android.support.design.widget.BottomSheetBehavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="8dp" android:gravity="center" android:padding="10dp" android:text="dialog_title_edit_phone" /> <android.support.design.widget.TextInputLayout android:id="@+id/inputPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/TextInputLayoutLabel"> <EditText android:id="@+id/etPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter phone" android:imeOptions="actionDone" android:inputType="phone" android:maxLines="1" android:textSize="20sp" /> </android.support.design.widget.TextInputLayout> <Button android:id="@+id/btnSavePhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/etPhone" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="8dp" android:text="Save" /> </LinearLayout> </FrameLayout> 

    À l'intérieur de style.xml ajoutez ceci.

     <style name="TextInputLayoutLabel" parent="Widget.Design.TextInputLayout"> <!-- Hint color and label color in FALSE state --> <item name="android:textColorHint">@android:color/black</item> <item name="android:textSize">15sp</item> <!-- Label color in TRUE state and bar color FALSE and TRUE State --> <item name="colorAccent">@color/colorPrimary</item> <item name="colorControlNormal">@color/colorAccent</item> <item name="colorControlActivated">@color/colorAccent</item> </style> 

    PhoneBottomDialog.java

     public class PhoneBottomDialog extends BottomSheetDialog { TextInputLayout inputPhone; EditText edtPhone; Button btnSave; public PhoneBottomDialog(Context context) { super(context); View view = getLayoutInflater().inflate(R.layout.phone_dialog, null); setContentView(view); // additional setup below this... inputPhone = (TextInputLayout) view.findViewById(R.id.inputPhone); edtPhone = (EditText) view.findViewById(R.id.etPhone); btnSave = (Button) view.findViewById(R.id.btnSavePhone); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!validatePhone()) return; } }); } private boolean validatePhone() { if (edtPhone.getText().toString().isEmpty()) { inputPhone.setError("Please enter valid phone number with country code."); requestFocus(edtPhone); return false; } else { inputPhone.setErrorEnabled(false); } return true; } private void requestFocus(View view) { if (view.requestFocus()) { getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } // ... } 

    Et à l'intérieur de l' Activity .

     @SuppressLint("SetTextI18n") @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test24); mContext = this; this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); PhoneBottomDialog dialog = new PhoneBottomDialog(mContext); dialog.show(); } 

    Ci-dessous, vous pouvez voir la sortie pour cela.

    Entrez la description de l'image ici

    Ajoutez compile 'com.android.support:design:24.2.0' dans les dépendances de gradle

    Utilisez TextInputLayout dans xml .

     <android.support.design.widget.TextInputLayout android:id="@+id/textInputServer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="36dp" app:errorTextAppearance="@style/TextErrorAppearance"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" ........./> </android.support.design.widget.TextInputLayout> 

    De la version de Lollipop (5.0), Android fournit TextInputLayout pour ce faire. Utilisez ci-dessous le code xml et java pour afficher la même vue de type.

    Abc.xml:

     <android.support.design.widget.TextInputLayout android:id="@+id/text_input_layout_user" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" app:theme="@style/AppTheme"> <android.support.v7.widget.AppCompatEditText android:id="@+id/et_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Username" android:imeOptions="actionNext" android:inputType="text" android:singleLine="true" android:textColor="@color/icons" android:textSize="16sp" /> </android.support.design.widget.TextInputLayout> 

    Abc.java:

     private TextInputLayout textInputLayout_User = (TextInputLayout) findViewById(R.id.text_input_layout_user); textInputLayout_User.setError(getString(R.string.valid_username)); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.