2011-10-29 3 views
65

Ho un FragmentActivity utilizzando un ViewPager per servire diversi frammenti. Ciascuno è una ListFragment con la seguente disposizione:Come nascondere la tastiera virtuale all'interno di un frammento?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="8dp"> 
     <ListView android:id="@id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

     <EditText android:id="@+id/entertext" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 
</LinearLayout> 

All'avvio dell'attività, spettacoli tastiera virtuale. Per rimediare a questo, ho fatto il seguente all'interno del frammento:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //Save the container view so we can access the window token 
    viewContainer = container; 
    //get the input method manager service 
    imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    . . . 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    //Hide the soft keyboard 
    imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0); 
} 

risparmio il parametro di ingresso ViewGroup container da onCreateView come un modo per accedere il token finestra per l'attività principale. Questo funziona senza errori, ma la tastiera non viene nascosta dalla chiamata a hideSoftInputFromWindow in onStart.

Originariamente, ho provato utilizzando il layout gonfiata anziché container, cioè:

imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0); 

ma questo ha gettato un NullPointerException, presumibilmente perché il frammento stesso non è un'attività e non hanno una finestra unico token ?

C'è un modo per nascondere la tastiera virtuale all'interno di un frammento oppure devo creare un metodo nello FragmentActivity e richiamarlo dal frammento?

risposta

134

Finché il tuo Frammento crea una vista, è possibile utilizzare l'IBinder (finestra token) da questo punto di vista dopo ha stato allegato Ad esempio, è possibile ignorare onActivityCreated nel Frammento:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
} 
+9

ho aggiunto questo al mio project.but quando clicco su un'altra scheda si blocca. –

+2

Per coloro che stanno facendo questo e ottenendo un arresto anomalo con NullPointerException, è sufficiente utilizzare InputMethodManager all'interno del metodo frammento onCreateView. In questo modo, avrai la tua vista e potrai cambiare l'ultima linea usando la vista che hai gonfiato su imm.hideSoftInputFromWindow (view.getWindowToken(), 0); – Aurasphere

19

Se si aggiunge il seguente attributo alla definizione manifest della propria attività, si eliminerà completamente la tastiera dall'apertura quando l'attività si apre. Speriamo che questo aiuta:

(Aggiungi definizione manifesta del vostro Attività):

android:windowSoftInputMode="stateHidden" 
+0

Grazie, questo è quello che ho finito per fare. Tuttavia, mi piacerebbe ancora sapere come utilizzare Input Method Manager per mostrare/nascondere la tastiera, perché potrei aver bisogno di usarlo qualche volta dopo l'avvio dell'attività. – WilHall

+4

come si può aggiungere il frammento in manifest. –

7

Eccezione per DialogFragment però, messa a fuoco del incorporato Dialog deve essere nascosto, invece solo il primo EditText all'interno del incorporato Dialog

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
+3

Questo è l'unico modo per nascondere il keybord, se si dispone di DialogFragment. –

+0

dove scrivere questo? – 1911192110920

+1

l'unica cosa che ha funzionato per me – skylla

56

Nient'altro la seguente riga di codice ha funzionato per me:

getActivity().getWindow().setSoftInputMode(
      WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
+4

Anche l'unica cosa che ha funzionato per me! – ToddH

+0

'SOFT_INPUT_STATE_HIDDEN' ha lavorato anche per me, anche se io non so quale sia la differenza tra questo e' SOFT_INPUT_STATE_ALWAYS_HIDDEN' è. – hBrent

+0

fratello di THanks, questo ha funzionato per me! :) –

11
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_my, container, 
       false); 
     someClass.onCreate(rootView); 
     return rootView; 
    } 

Tenere un'istanza di mio punto di vista radicale nella mia classe

View view; 

public void onCreate(View rootView) { 
    view = rootView; 

Utilizzare la vista per nascondere la tastiera

public void removePhoneKeypad() { 
    InputMethodManager inputManager = (InputMethodManager) view 
      .getContext() 
      .getSystemService(Context.INPUT_METHOD_SERVICE); 

    IBinder binder = view.getWindowToken(); 
    inputManager.hideSoftInputFromWindow(binder, 
      InputMethodManager.HIDE_NOT_ALWAYS); 
} 
+0

L'ho usato ma ho usato getView() dal mio frammento invece di mantenere un'istanza della mia vista. – MrEngineer13

+0

onCreate è una classe al di fuori di Fragment, quindi lo passo a rootView per poterlo utilizzare per rimuovere phoneKeyPad in questa classe. Suppongo che lo volessero dall'interno del Frammento non una classe nel Frammento. –

1

in Fragemnt di lavoro presente Codice

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);