2014-09-04 8 views
19

Ho un'attività con un frammento. Diciamo un frammento di lista con un elenco di cose. Ora voglio lasciare che l'utente aggiunga una cosa, quindi uso FragmentManager per sostituire il frammento di lista con un frammento di inserimento che ha un EditText. EditText ha lo stato attivo e il cursore lampeggia. Ma la tastiera non si apre. Stessa cosa al contrario: se l'utente ha inserito la nuova cosa e l'ha aggiunta alla lista, sostituisco il frammento di inserto con un frammento di lista. Ma anche se non c'è più EditText, la tastiera non si chiude.Mostra/nascondi tastiera software Android sul frammento sostituire

Qual è il modo corretto di implementarlo? Non posso credere di dover mostrare e nascondere la tastiera manualmente su tutte le transizioni ?!

+0

'L'EditText ha la messa a fuoco e il cursore lampeggia. Ma la softkey non si apre. Nel tuo 'AndroidManifest.xml' all'interno del tag di questa attività, hai impostato 'android: windowSoftInputMode =" stateHidden "'? Se sì, una volta che l'utente fa clic su 'EditText', solo la softkey sarà mostrato.Else non verrà mostrato anche se lo stato attivo è su 'EditText'. –

+0

Quello che penso è che è necessario fare riferimento [android: documenti windowSoftInputMode] (http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft) e provare diverse combinazioni. Quindi vedere se può trovare la combinazione richiesta. –

+0

Non ho alcun codice di input impostato nel manifest e non credo che possa essere d'aiuto perché controlla come reagisce la tastiera quando si entra nell'attività. Ma il mio problema è la transizione verso un altro frammento. – Maniac

risposta

3

Per visualizzare la tastiera:

editText.requestFocus(); 
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
keyboard.showSoftInput(editText, 0); 

e poi nasconderlo:

InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
+0

Conosco metodi manuali per mostrare/nascondere la tastiera (anche se alcuni di essi non funzionano sempre e sono affidabili). Ma non posso credere di doverlo controllare da solo. Ci sono molti eventi del ciclo di vita che possono innescare situazioni diverse. Prima dei frammenti, questo funzionava senza problemi (passando da un'attività a un'altra attività che ha un EditText). Quindi spero di non doverlo fare manualmente ?! – Maniac

0

sto indovinando che il vostro ListView è rubare il centro della vostra EditText, provate questo e fammi sapere se aiuta.

getListView().setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 
-1

Un modo è quello di chiamare Activity.recreate, in quanto è necessario per gestire il caso orientamento cambio comunque. Sembra eccessivo, e finisci anche con diverse animazioni di transizione.

0

Prova questa

InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 

    imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 
    editText.requestFocus(); 
1

Ciò funzionerà di sicuro:

private void hideKeyboard() { 
    // Check if no view has focus: 
    View view = this.getCurrentFocus(); 
    if (view != null) { 
     InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
     inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 

    private void showKeyboard(){ 
    EditText myEditText = (EditText) findViewById(R.id.myEditText); 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 
    } 
0

Sono d'accordo, non riuscivo a credere che si doveva nascondere manualmente la tastiera.

aggiungere questo alla tua Frammento onCreate che non si desidera che la tastiera non essere in:

((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(mToolbar.getWindowToken(), 0); 

cambiamento mToolbar a qualsiasi vista all'interno del layout. In questo caso ho usato la mia barra degli strumenti.

Aggiungilo a Framment onCreate per visualizzare la tastiera.

 ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 
0

è possibile utilizzare sotto il codice per nascondere la tastiera virtuale.

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); 
3

ho lo stesso problema con la mia app e, infine, abbiamo 2 opzioni, in un primo momento creare una funzione generale e chiamare questo in tutte le transizioni o creare una transizione globale come questo:

public static void RemoveAndReplaceFragment(FragmentManager fragmentManager, int FragmentContent, Fragment PlaceHolderFragment,Activity context){ 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frgMainActivity)) 
       .commit(); 

     //Close keyBoard in transition 
     InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
       Context.INPUT_METHOD_SERVICE); 
     inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), 
       InputMethodManager.HIDE_NOT_ALWAYS); 

     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.setCustomAnimations(R.anim.animation_fade_in,R.anim.animation_fade_out); 
     fragmentTransaction.replace(R.id.frgMainActivity, new PlaceholderFragment_MainActivity_AcceptAndFollowTask()).commit(); 
    } 
} 

Il il modo migliore è catturare l'evento di transizione ma non possiamo in questo momento ... Dimmi se ti aiuto, buona fortuna!

4

lo farei per seguenti cose:

1. Estendere Fragment classe
2. Override onAttach() e onDetach() callback
3.Implementare mostrare e nascondere il software metodo di tastiera

codice di esempio:

class MyFragment extends Fragment { 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     //show keyboard when any fragment of this class has been attached 
     showSoftwareKeyboard(true); 
    } 

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

     //hide keyboard when any fragment of this class has been detached 
     showSoftwareKeyboard(false); 
    } 

    protected void showSoftwareKeyboard(boolean showKeyboard){ 
     final Activity activity = getActivity(); 
     final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE); 

     inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS); 
    } 
}