2014-09-04 9 views
19

Ich habe eine Aktivität mit einem Fragment. Sagen wir ein Listenfragment mit einer Liste von Dingen. Jetzt möchte ich dem Benutzer ein Ding hinzufügen lassen, also benutze ich den FragmentManager, um das Listenfragment durch ein Einfügungsfragment zu ersetzen, das einen EditText hat. Der EditText hat den Fokus und der Cursor blinkt. Aber das Softkeyboard öffnet sich nicht. Dasselbe Ding anders herum: wenn der Benutzer das neue Ding eingegeben hat und es der Liste hinzugefügt hat, ersetze ich das Einfügungsfragment zurück mit einem Listenfragment. Aber obwohl es keinen EditText mehr gibt, wird die Tastatur nicht geschlossen.Android Softkeyboard auf Fragment ersetzen/ersetzen

Was ist der richtige Weg, dies zu implementieren? Ich kann nicht glauben, dass ich die Tastatur manuell auf allen Übergängen anzeigen und verstecken muss ?!

+0

'Die EditText den Fokus hat und der Cursor blinkt. Aber das Softkeyboard öffnet sich nicht.Haben Sie in Ihrer 'AndroidManifest.xml' im Tag dieser Aktivität' android: windowSoftInputMode = "stateHidden" 'gesetzt? Wenn ja, sobald der Benutzer auf' EditText' klickt, wird nur das Softkeyboard angezeigt gezeigt.Es wird nicht angezeigt, auch wenn der Fokus auf 'EditText' liegt. –

+0

Was ich denke, ist, dass Sie verweisen müssen [android: windowSoftInputMode Dokumente] (http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft) und verschiedene Kombinationen ausprobieren. Dann sehen Sie, ob Sie kann Ihre gewünschte Kombination finden. –

+0

Ich habe keine Eingabemodi im Manifest eingestellt und ich glaube nicht, dass es helfen wird, weil es steuert, wie das Softkeyboard beim Eintreten in die Aktivität reagiert. Aber mein Problem ist der Übergang zu einem anderen Fragment. – Maniac

Antwort

3

die Tastatur zu zeigen:

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

und dann, es zu verbergen:

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

Ich weiß über manuelle Möglichkeiten, die Tastatur zu zeigen/zu verbergen (obwohl einige von ihnen nicht immer und zuverlässig funktionieren). Aber ich kann nicht glauben, dass ich das allein kontrollieren muss. Es gibt viele Lebenszyklusereignisse, die verschiedene Situationen auslösen können. Vor den Fragmenten funktionierte das ohne Probleme (beim Übergang von einer Aktivität zu einer anderen Aktivität mit einem EditText). Also ich hoffe ich muss es immer noch nicht manuell machen ?! – Maniac

0

Ich vermute, dass Ihr ListView wird den Fokus Ihrer EditText stehlen, versuchen Sie dies und lassen Sie mich wissen, wenn es hilft.

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

Eine Möglichkeit ist Activity.recreate zu nennen, da sie die Orientierung Änderungs Fall zu behandeln ohnehin notwendig ist. Scheint wie Overkill, und du erhältst auch verschiedene Übergangsanimationen.

0

starten

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

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

Dies sicher arbeiten:

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

Ich stimme zu, konnte ich nicht glauben, dass Sie mussten auch manuell über die Tastatur auszublenden.

Fügen Sie diese auf Ihrem Fragment onCreate, dass Sie nicht sein, nicht über die Tastatur wollen:

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

Änderung mToolbar zu einer beliebigen Ansicht im Layout. In diesem Fall habe ich meine Symbolleiste benutzt.

Fügen Sie dies dem Fragment onCreate hinzu, das die Tastatur angezeigt werden soll.

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

können Sie den folgenden Code verwenden, um die Softtastatur auszublenden.

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

Ich habe das gleiche Problem mit meiner App und schließlich haben wir zwei Möglichkeiten, zunächst eine allgemeine Funktion dies in allen Übergängen erstellen und rufen oder einen globalen Übergang zu schaffen, wie diese:

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

Die Der beste Weg ist, das Übergangsereignis einzufangen, aber wir können nicht in diesem Moment ... Sag mir, wenn ich dir helfe, viel Glück!

4

würde ich auf folgende Dinge:

1. Erweitern Fragment Klasse
2. Aufschalten onAttach() und onDetach() Rückrufe
3.Implementieren Sie zeigen und verbergen Software-Tastatur Methode

Beispielcode:

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); 
    } 
} 
Verwandte Themen