Problemas enfocando EditTexts en un ListView (Android)

Tengo un ListView con algunos EditTexts en cada artículo. No tengo ningún problema con un teclado de hardware, pero las cosas se ponen un poco fuera de control con el teclado suave. Tengo dos problemas.

  1. Cuando primero hago clic en un EditText, aparece brevemente para tener foco pero después pierde el foco una vez que el teclado ha demostrado. Debo hacer clic en el EditText de nuevo para obtener el enfoque.
  2. Cuando un EditText con el foco se desplaza fuera de la vista, el foco va a … bien … ver la captura de pantalla. No estoy seguro de lo que está pasando.

Más detalles en # 1:

  • Cuando la pantalla se carga por primera vez, el enfoque está en el campo "Gr High School Scale", pero el teclado no se muestra.
  • Si inmediatamente hago clic en un EditText deseado, su OnFocusChangeListener me dice que recibe el foco y luego pierde el foco. Visualmente, veo que el cursor aparece en el campo, pero cuando el teclado carga el cursor salta (como en la captura de pantalla) y no sé dónde se ha centrado.

He jugado un poco los atributos Focusable y DescendantFocusability del ListView, pero sin éxito. ¿Algún consejo?

Cada vez que un EditText con enfoque se desplaza fuera de la vista, aparece otro cursor borracho: introduzca la descripción de la imagen aquí

UPDATE: Código relevante.
Diseño de la actividad con XML ListView:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res/com.NsouthProductions.gradetrackerpro" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.NsouthProductions.gradetrackerpro.Activity_EditCourseGPA" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="34dp" android:text="Define the GPA and Percent scale for this course." /> <RadioGroup android:id="@+id/radioGroup1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:layout_marginLeft="5dp" > <LinearLayout android:id="@+id/linlay_rad_group_existing_scale" android:layout_width="match_parent" android:layout_height="match_parent" > <RadioButton android:id="@+id/radio0_existing_scale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:checked="true" android:text="Existing Scale" /> <Spinner android:id="@+id/spinner_existing_scales" android:layout_width="wrap_content" android:layout_height="33dp" android:layout_gravity="right" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:id="@+id/linlay_rad_group_new_scale" android:layout_width="match_parent" android:layout_height="wrap_content" > <RadioButton android:id="@+id/radio1_new_scale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:text="New Scale" /> <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_height="wrap_content" android:lines="1" android:maxLines="1" android:text=" " /> <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="textPersonName" android:maxLines="1" android:scrollHorizontally="true" android:text="Gr High School Scale" > <requestFocus /> </EditText> </LinearLayout> </RadioGroup> <LinearLayout android:id="@+id/linlay_scale_save_buttons" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" > <Button android:id="@+id/btn_gpa_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/btn_gpa_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> <ListView android:id="@+id/listview_scale" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/linlay_scale_save_buttons" android:layout_alignParentLeft="true" android:layout_below="@id/radioGroup1" android:focusable="true" android:focusableInTouchMode="true" android:headerDividersEnabled="true" android:scrollingCache="true" > </ListView> 

Elementos de lista XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linlay_scale_list_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/checkbox_scale_item" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="A-" /> <EditText android:id="@+id/et_gpa" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:enabled="true" android:inputType="numberDecimal" android:maxLength="6" android:text="4.000" /> <EditText android:id="@+id/et_min" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:enabled="true" android:inputType="numberDecimal" android:maxLength="6" android:text="94.75" /> <EditText android:id="@+id/et_max" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="numberDecimal" android:maxLength="6" android:text="100.0" /> 

Configuración de la vista en mi adaptador:

 View v = convertView; ViewHolder holder; v = inflater.inflate(R.layout.scale_list_item, holder = new ViewHolder(); holder.cb = (CheckBox) v.findViewById(R.id.checkbox_scale_item); holder.et_gpa = (EditText) v.findViewById(R.id.et_gpa); holder.et_min = (EditText) v.findViewById(R.id.et_min); holder.et_max = (EditText) v.findViewById(R.id.et_max); 

No estoy seguro de qué más publicar. Tengo enfoque y textChange oyentes, pero el problema existe incluso si se comentan. Déjame saber si se necesita algo más. Gracias.

Más detalle sobre cómo se está comportando el enfoque cuando se toca el EditText:

  1. El EditText se hace clic (tocado)
  2. EditText Recibe el foco
  3. EditText pierde el foco
  4. ListView gana el foco (e intenta fijar la requestChildFocus opinión del foco del requestChildFocus … no parece tener éxito).
  5. ListView pierde el foco
  6. ListView gana el foco (e intenta fijar el foco del niño otra vez).

Lo anterior se basa en tener oyentes tanto para el EditText como para el ListView. Nota: con un teclado de hardware, el EditText obtiene el foco y eso es todo. Creo que el teclado suave que aparece afecta el enfoque.

FINAL UPDATE: Al final, trabajar con ListView fue demasiado difícil, especialmente porque quería actualizar varias filas basadas en cambios en un EditText en una fila. Eso es difícil de hacer cuando el teclado está hacia arriba y el ListView sólo considera algunas de las filas para existir en cualquier momento.

En su lugar, realizé LinearLayouts anidados. Cada diseño horizontal era una "fila" y los puse dentro de un ArrayList con el fin de administrarlos y fue un pedazo de pastel, comparativamente (todavía no es fácil).

Se enfrenta al problema de reciclaje de ListView . Cuando se desplaza hacia arriba o hacia abajo o cuando aparece el teclado ListView actualiza de nuevo y se pierde el EditText's . Por lo tanto, en primer lugar leer esta respuesta para entender ListView Recycling mecanismo y luego seguir la sugerencia de mi lado la solución de su actual escenario en mi mente.

Sugiero que debe utilizar un Button en ListView artículo y el texto de este botón debe ser genérico como Enter Info Estudiante o lo que quieras. Después de hacer clic en este Button abrir AlertDialog y establecer su vista xml (actualmente todos sus edittexts como et_gpa, et_min, et_max etc en los elementos de lista)

Por ejemplo:

 btnInfo.setOnClickListener(new OnClickListener() { public void onClick(View v) { showStudentInfoAlert(); } }); public void showStudentInfoAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(context); LayoutInflater in = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = in.inflate(R.layout.your_xml_having_edittexts, null); EditText et_gpa = (EditText) v.findViewById(R.id.et_gpa); //add all edit texts like this and after that just set view on alert dialog builder.setTitle("Enter student's info"); builder.setView(v); builder.setPositiveButton("Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //save all edittexts values and do what erver you want with those values } }); dialog.show(); } 

en primer lugar cuando la pantalla se carga, el foco está en el campo "Gr High School Scale", debido a esto <requestFocus /> en su xml. pero esto no gurantee que el teclado podría mostrar .. para hacer que el teclado para mostrar el uso getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); también estoy pensando que pierde el foco inmediatamente porque el listview ha tomado el foco lejos del edittext

 <ListView android:id="@+id/listview_scale" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/linlay_scale_save_buttons" android:layout_alignParentLeft="true" android:layout_below="@id/radioGroup1" android:focusable="true" //this android:focusableInTouchMode="true" // and that android:headerDividersEnabled="true" android:scrollingCache="true" > 

, y puesto que ninguno de sus edittext del listview está pidiendo el foco, el foco permanece encendido apenas el listview no el edittext. .so usted necesita volver a aparecer el foco de nuevo al edittext. también de la documentación del androide indica Por defecto el usuario no puede mover el enfoque a una vista; .. y también afirma que "si focusableInTouchMode es true para una vista, esa vista puede ganar foco cuando se hace clic en, y puede mantener el foco si se hace clic en otra vista que no tiene este atributo establecido en true". primero crea un edittext que agrega automáticamente <requestFocus /> a él que especifica que necesita tomar el foco, o puede tomar el foco … pero en su caso y con este documentaion el edittext nunca mantendrá el foco porque el listview lo está llevando lejos de él .. así que en resumen intentar esto en todas las vistas (incluyendo su edittext) que desea tomar el foco como lo hizo en el listview

 android:focusable="true" android:focusableInTouchMode="true" 

así que trate de que en el edittext y hágamelo saber si ayuda .. gracias por esperar

  • Reproducción automática de vídeos (vista de lista)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.