2012-02-03 6 views
5

Uso un ViewPager con 3 frammenti. Il primo ha solo testo. Il secondo, un campo di input. il terzo, solo testo.Android ViewPager mostra la tastiera virtuale nel posto sbagliato

Quando il ViewPager viene inizializzato, viene visualizzata la tastiera software, poiché il focus è impostato sul campo di immissione. Se cambio l'ordine del frammento, la tastiera virtuale non viene mostrata.

Come posso controllare la tastiera focus e soft con ViewPager?

saluti

+0

Forse è possibile forzare nascondere il soft keybord. Maggiori dettagli qui: http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard –

risposta

1

Sono sicuro che ci sia un modo migliore per fare questo, ma ho avuto lo stesso problema e ho ottenuto intorno ad esso impostando il genitore View a attivabile. In questo modo, qualunque sia sta causando la tastiera virtuale da popping up non riceveranno messa a fuoco quando si scorrere tra le pagine ...

<!-- Dummy item to prevent your View from receiving focus --> 
<LinearLayout 
    ... 
    android:focusable="true" 
    android:focusableInTouchMode="true" /> 

    <!-- The view(s) that are causing the keyboard to pop up each time you swipe --> 
    <EditText ... /> 

</LinearLayout> 
+0

Purtroppo non nasconde la tastiera quando si torna a un frammento senza edittexts. – Timmmm

5

La soluzione migliore che ho trovato finora è quello di utilizzare android:windowSoftInputMode="stateHidden" nel manifesto della vostra attività, e quindi aggiungi questo alla tua attività.

@Override 
public void onPageScrollStateChanged(int state) 
{ 
    if (state == ViewPager.SCROLL_STATE_IDLE) 
    { 
     if (mViewPager.getCurrentItem() == 0) 
     { 
      // Hide the keyboard. 
      ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) 
       .hideSoftInputFromWindow(mViewPager.getWindowToken(), 0); 
     } 
    } 
} 

non ho usato onPageSelected() perché le viti di animazione nascondere-tastiera con l'animazione strisciata. E non ho usato il trucco android:focusable perché la tastiera non è nascosta quando si scorre verso un frammento senza input. Anche se suppongo che potresti combinarlo con il codice sopra.

0

Grazie a tutti, Timmmm è stato molto utile. Alla fine ho avvolto tutto e ho ottenuto una soluzione completa per nascondere la tastiera morbida per lo scorrimento delle schede. Ho 4 schede con editTexts su ognuna e ho bisogno di nascondere la tastiera durante lo scorrimento. Ho aggiunto che questo layout di frammento:

<!--Fixes keboard pop-up--> 
<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:background="@android:color/transparent" 
    android:focusable="true" 
    android:focusableInTouchMode="true"> 
</LinearLayout> 

che sono stati aggiunti al codice attività (notare una piccola differenza con la risposta di un Timmmm: Non ho

mViewPager.getCurrentItem() == 0 

qui, perché ho bisogno di nascondere tastiera per ogni vista:

// When swiping between different sections, select the corresponding 
    // tab. We can also use ActionBar.Tab#select() to do this if we have 
    // a reference to the Tab. 
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      if (actionBar != null) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     } 
     @Override 
     public void onPageScrollStateChanged(int state) 
     { 
      if (state == ViewPager.SCROLL_STATE_IDLE) 
      { 
       // Hide the keyboard. 
       ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) 
         .hideSoftInputFromWindow(mViewPager.getWindowToken(), 0); 

      } 
     } 
    }); 

E qui è un'attività in AndroidManifest.xml:

<activity 
     android:name=".TestActivity" 
     android:label="@string/title_activity_test" 
     android:parentActivityName=".MainActivity" 
     android:windowSoftInputMode="stateHidden"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.atrinax.test.MainActivity" /> 
</activity>