Perché la tastiera soft visualizza o less quando inizia un'attività?

Quando abbiamo confrontato il nostro progetto tra gli sviluppatori, abbiamo trovato un comportmento strano. Dopo alcune analisi siamo andati a questa osservazione.

Quando l'attività viene avviata, in alcuni casi viene visualizzata la tastiera ma a volte non viene visualizzata.

  • Leader di Google Game Game Services - Imansible impostare correttamente i vasi in Eclipse
  • Imansible bind a XXXX locale per il debugger
  • Ottieni nome e tipo da PRAGMA table_info ()
  • leggere i dati dal database e mostrarlo in GridView in android
  • Come eseguire CountDownTimer in un servizio in Android?
  • Google-plus: impossibilitato a caricare la persona
  • Infatti, senza uno ScrollView , la tastiera soft non viene visualizzata per impostazione predefinita in un EditText .

     <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" tools:context=".TestActivity" > <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> </LinearLayout> 

    Ma quando aggiungiamo uno ScrollView , la tastiera soft viene visualizzata per impostazione predefinita.

     <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" tools:context=".TestActivity" > <ScrollView android:id="@+id/scrollView1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> </ScrollView> </LinearLayout> 

    Dipende solo dalla presenza dello ScrollView . Possiamo risolvere questo problema con una dichiarazione specifica in AndroidManifest , ma questo è il comportmento predefinito.

    Io e il mio compagno di sviluppo chiedo perché questo accada?

  • Imansible eseguire il test di JUnit 4 nel progetto Android Eclipse
  • Usa C con Android ndk
  • Android disegna il path in una Mapview con due POI
  • JNI in Android Studio
  • Gradle non ha potuto trovare com.android.databinding: dataBinder: 1.0-rc0
  • Devo utilizzare PendingIntent.getService () o getBroadcast con AlarmManager?
  • 3 Solutions collect form web for “Perché la tastiera soft visualizza o less quando inizia un'attività?”

    Ecco cosa capisco di questo problema dopo aver scavato nel codice di Android e costruendo alcuni layout di test con un EditText .

    Come ScrollView è definito come

      public class More ...ScrollView extends FrameLayout { ... } 

    Ho provato a utilizzare un FrameLayout come un contenitore per un elemento EditText . Di conseguenza la tastiera del software non viene triggersta.

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="text" > <requestFocus /> </EditText> </FrameLayout> 

    Ma come scritto nella domanda, utilizzando uno ScrollView triggers la tastiera del software (ho semplificato l'origine xml).

     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="text" > <requestFocus /> </EditText> </ScrollView> 

    Quindi l'elemento che consente di triggersre la tastiera del software è nel file sorgente di ScrollView .

    Modifica: dopo aver creato la mia class MyFrameLayout estendendo FrameLayout e giocando con il codice, ho scoperto che è qualcosa nello stile di scorrimento predefinito ( R.attr.scrollViewStyle ) che è responsabile della visualizzazione o less della tastiera …

    Edit2: infine l'attributo android:scrollbars consentono alla tastiera di essere triggersto automaticamente all'avvio se presente …

    Nel mio caso android: le barre di scorrimento fissi finché non ho dovuto aggiungere:

     android:windowSoftInputMode="adjustResize"> 

    Per scorrere quando viene visualizzata la tastiera.

    Per poter utilizzare entrambe le properties; ho dovuto aggiungere:

     android:focusableInTouchMode="true" 

    Nel figlio della Scrollview

    Ho trovato la risposta focusableInTouchMode qui: Stop EditText da acquisire la messa a fuoco all'avvio dell'attività

    Ciò è dovuto al fatto che quando e quando viene lanciato, Android si concentra sulla prima visualizzazione disponibile. Nel primo caso è il text Modifica, ecco perché la tastiera viene visualizzata. Nel secondo caso, la prima vista è la ScrollView è la prima vista, che non richiede tastiera, quindi non viene visualizzata. Inoltre, nel primo caso, è ansible rimuovere <requestFocus /> e su alcuni dispositivi, la tastiera, non verrà visualizzata. Spero che questo ti aiuti.

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