Problemi relativi a EditTexts in un elenco (Android)

Ho un ListView con alcuni EditTexts in each elemento. Non ho problemi con una tastiera hardware, ma le cose vanno un po 'con la tastiera soft. Ho due problemi.

  1. Quando faccio prima clic su un EditText, sembra brevemente avere la messa a fuoco, ma perde la messa a fuoco una volta che la tastiera è stata mostrata. Devo quindi click di nuovo su EditText per get la messa a fuoco.
  2. Quando un EditText con focus è scorciato dalla vista, la messa a fuoco va a … beh … vedere lo screenshot. Non so cosa sta succedendo.

Maggiori dettagli su # 1:

  • Aggiunta di animazioni a una vista di elenco in Android
  • Leggi un'image / file dall'archivio di storage esterno Android
  • Android proguard, Nullpointer Eccezione sul dispositivo
  • API v2 di Google Maps non funziona con la chiave di rilascio
  • Errore: (218) L'apostrofo non preceduto da \
  • Come posso monitorare lo stato della connessione di networking in Android?
    • Quando lo schermo viene caricato per la prima volta, la messa a fuoco è nel field "Gr High School Scale", ma la tastiera non viene visualizzata.
    • Se faccio immediatamente clic su un EditText desiderato, il suo OnFocusChangeListener mi dice che riceve la messa a fuoco e perde quindi la messa a fuoco. Visivamente, vedo che il cursore apparirà nel field, ma quando la tastiera carica il cursore salta via (come nello screenshot) e non so where sia scattata la messa a fuoco.

    Ho giocato un po 'intorno agli attributi Focusable e DescendantFocusability del ListView, ma a nessun risultato. Qualche consiglio?

    Ogni volta che un EditText con messa a fuoco viene scorciato dalla vista, viene visualizzato un altro cursore ubriaco: immettere qui la descrizione dell'immagine

    UPDATE: Codice rilevante.
    Layout di attività con ListView XML:

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

    Elementi di elenco 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" /> 

    Impostazione della vista nella mia scheda:

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

    Non so quale altro post. Ho focus e textChange ascoltatori, ma il problema esiste anche se quelli sono commentati. Fammi sapere se è necessario un altro. Grazie.

    Ulteriori dettagli su come si esegue la messa a fuoco quando viene toccato il text EditText:

    1. Viene cliccato il text EditText (toccato)
    2. EditText Riceve la messa a fuoco
    3. EditText perde la messa a fuoco
    4. ListView guadagna la messa a fuoco (e cerca di impostare la richiesta di messa a fuoco del bambino requestChildFocus … non sembra avere successo).
    5. ListView perde la messa a fuoco
    6. ListView guadagna la messa a fuoco (e cerca di impostare nuovamente la messa a fuoco del figlio).

    Quanto sopra si basa su avere ascoltatori sia per EditText che per ListView. Nota: con una tastiera hardware, il text EditText ottiene la messa a fuoco e questo è quello. Penso che la tastiera soft che appaia influenza la messa a fuoco.

    AGGIORNAMENTO FINALE: Alla fine, lavorare con il ListView era troppo difficile, soprattutto perché volevo aggiornare più righe in base a modifiche a un text EditText in una row. Che è difficile da fare quando la tastiera è in su e il ListView considera solo alcune delle righe esistenti in una sola volta.

    Invece ho fatto LinearLayouts annidato. Ogni layout orizzontale era una "row" e li ho messi all'interno di un ArrayList per gestirli ed era un pezzo di torta, relativamente (ancora non facile).

  • C'è codice per Snackbar in Android L o ci aspettiamo di implementarli?
  • BOOT_COMPLETED non ricevuto
  • Utilizzo di Android personalizzato ProgressDialog
  • Traduci la mia applicazione in ungherese
  • OutOfMemoryException: Caricare un gruppo di immagini dal server
  • Ottenere i dati dalla notifica cliccata in android
  • 2 Solutions collect form web for “Problemi relativi a EditTexts in un elenco (Android)”

    Si sta affrontando il problema di recupero ListView . Quando si scoreggia su o giù o quando la tastiera appare ListView si aggiorna e perse il focus EditText's . Quindi, prima di tutto leggere questa risposta per capire il meccanismo di recupero di ListView e quindi seguire il suggerimento da parte mia la soluzione del tuo scenario attuale nella mia mente.

    Suggerisco di utilizzare un Button in ListView e il text di questo button dovrebbe essere generico come Enter Student Info o quello che ti piacerebbe. Dopo aver fatto clic su questo Button Apri AlertDialog e impostate la tua visualizzazione xml (attualmente i tuoi tutti i edittexts come et_gpa, et_min, et_max etc su elementi di listview )

    Per esempio:

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

    prima di tutto quando lo schermo viene caricato, il fuoco è sul field "Gr High School Scale", a causa di questo <requestFocus /> nel tuo xml. ma questo non ha alcuna garanzia che la tastiera potrebbe mostrare .. per far vedere la tastiera utilizzare getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); anche io penso che perde la messa a fuoco immediatamente perché la listview ha messo a fuoco lontano dal 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" > 

    , e poiché nessuno del tuo elenco di visualizzazioni richiede la messa a fuoco, l'attenzione rimane solo sulla listview non il edittext..so è necessario riprintingre la messa a fuoco indietro al edittext..anche dalla documentazione android che state Per impostazione predefinita l'utente non può spostare la messa a fuoco in una vista; .. e inoltre afferma che "se focusableInTouchMode è true per una vista, tale vista può acquisire la messa a fuoco quando si fa clic su e può mantenere la messa a fuoco se si fa clic su un'altra vista che non ha questo attributo impostato su true". innanzitutto crea un edittext che aggiunge automaticamente <requestFocus /> specifichandolo che deve focalizzarsi, oppure può focalizzarti .. ma nel tuo caso e con questo documento, il edittext non manterrà mai la messa a fuoco perché la listview lo sta portndo via .. quindi in breve provate questo su tutte le viste (compreso il tuo edittext) che vuoi mettere a fuoco come hai fatto nell'elenco

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

    in modo da provare che sul edittext e lasciami sapere se aiuta..hanno per aspettare

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.