Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


EditText setError está fuera de lugar en BottomSheetDialog

Estoy enfrentando un problema con la posición del indicador de error de mi EditText cuando llamo a editText.setError("...") .

Como se puede ver en la captura de pantalla estoy usando un BottomSheetDialog con un EditText dentro de él. Cuando muestro el indicador de error, el texto está completamente fuera de lugar. Parece como si el diálogo "piensa" que es a pantalla completa, mientras que en realidad no.

Introduzca aquí la descripción de la imagen

Este es mi archivo de diseño de diálogo (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> 

Mi archivo de disposición de actividad (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> 

Así es como muestro el diálogo de mi Activity :

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

Esta es mi clase 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... } // ... } 

No estoy realizando ningún otro diseño dentro de mi PhoneButtomDialog personalizado. Cambiar la disposición de la raíz de mi diálogo a RelativeLayout o LinearLayout así como agregar ScrollView no cambió nada. Tampoco es un dispositivo o un problema relacionado con la versión de Android específica, ya que el problema se produce en todos mis dispositivos de prueba que van desde Android 5.0 a 7.1, también se produce en el emulador.

¿Alguien tiene una idea de por qué esto está sucediendo?

  • ¿Cuál es la diferencia entre AlertDialog.builder.setView y Dialog.setContentView?
  • Obtener contexto dentro de onClick (DialogInterface v, int buttonId)?
  • ¿Cómo puedo crear un Spinner de Android como una ventana emergente?
  • Android - ¿Cómo mostrar un diálogo en una pantalla nativa?
  • Android: aumenta AlertDialog desde el subproceso de fondo
  • Cómo DialogFragment afecta el ciclo de vida de la actividad de llamada
  • Cómo hacer que un cuadro de diálogo de PreferenciaActividad abra una ventana de diálogo para establecer una preferencia personalizada
  • Mostrar diálogo de la rueda giratoria mientras carga datos en Android
  • 3 Solutions collect form web for “EditText setError está fuera de lugar en BottomSheetDialog”

    Puede utilizar TextInputLayout y en el interior que puede definir Edit Text .

    He hecho algunas modificaciones dentro de tu 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> 

    Dentro de style.xml agrega esto.

     <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); } } // ... } 

    Y dentro de la 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(); } 

    A continuación puede ver la salida para esto.

    Introduzca aquí la descripción de la imagen

    Add compile 'com.android.support:design:24.2.0' en dependencias de gradle

    Utilice TextInputLayout en 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> 

    Desde Lollipop (versión 5.0), android proporciona TextInputLayout para hacer esto. Utilice el código xml y java para mostrar la misma vista de tipo.

    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)); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.