2014-09-04 9 views
19

Mam aktywność z fragmentem. Powiedzmy fragment listy z listą rzeczy. Teraz chcę pozwolić użytkownikowi dodać coś, więc używam FragmentManagera do zastąpienia fragmentu listy fragmentem wstawki, który ma EditText. EditText ma fokus, a kursor miga. Ale softkeyboard nie otwiera się. To samo w inny sposób: jeśli użytkownik wprowadził nową rzecz i dodał ją do listy, zastępuję fragment wstawki powrotem fragmentem listy. Ale chociaż nie ma już EditText, klawiatura się nie zamyka.Pokaż/ukryj klawisze programowalne Android na fragmentie zamień

Jaki jest właściwy sposób realizacji tego? Nie mogę uwierzyć, że muszę pokazywać i ukrywać klawiaturę ręcznie na wszystkich przejściach ?!

+0

'EditText ma fokus i kursor miga. Ale softkeyboard nie otwiera się. "W twoim" AndroidManifest.xml "wewnątrz znacznika tej czynności, czy ustawiłeś' android: windowSoftInputMode = "stateHidden" '? Jeśli tak, to gdy użytkownik kliknie na' EditText', wtedy tylko softkeyboard będzie pokazane. Pozwolić, że nie będzie pokazane, nawet jeśli fokus jest ustawiony na "EditText". –

+0

Co myślę, że musisz odnieść się [android: dokumenty windowSoftInputMode] (http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft) i wypróbować różne kombinacje. Następnie sprawdź, czy może znaleźć wymaganą kombinację. –

+0

Nie mam żadnych ustawień wejściowych w manifeście i nie sądzę, że to pomoże, ponieważ kontroluje sposób reagowania softkeyboard po wejściu w działanie. Ale moim problemem jest przejście do innego fragmentu. – Maniac

Odpowiedz

3

Aby wyświetlić klawiaturę:

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

a następnie ukryć go:

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

Wiem o ręcznych sposobach pokazywania/ukrywania klawiatury (chociaż niektóre z nich nie działają zawsze i niezawodnie). Ale nie mogę uwierzyć, że muszę to kontrolować na własną rękę. Istnieje wiele zdarzeń cyklu życia, które mogą powodować różne sytuacje. Przed fragmentami działało to bez problemów (przy przejściu z działania do innego działania, które ma EditText). Mam więc nadzieję, że nadal nie muszę tego robić ręcznie ?! – Maniac

0

Domyślam się, że ListView jest kradzież ostrość twoich EditText, spróbuj i daj mi znać, jeśli to pomaga.

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

Jednym sposobem jest wywołanie Activity.recreate, ponieważ jest to niezbędne do obsługi sprawy orientacja-change tak. Wygląda na przesadę, a ty także otrzymujesz różne animacje przejścia.

0

Spróbuj

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

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

To będzie działać na pewno:

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

zgadzam się, nie mogłem uwierzyć, że trzeba było ręcznie ukryć klawiaturę, jak również.

Dodaj to do swojej Fragment onCreate że nie chcesz klawiatura nie być w:

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

zmian mToolbar do dowolnego widoku w układzie. W tym przypadku użyłem mojego paska narzędzi.

Dodaj to do Fragment naUtwórz, że chcesz wyświetlić klawiaturę.

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

można użyć poniższego kodu do ukrycia miękkiej klawiatury.

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

Mam ten sam problem z moim app i wreszcie mamy 2 opcje, najpierw stworzyć ogólną funkcję i nazywają to we wszystkich przejściach lub utworzyć przejście globalnej, jak ta:

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

Najlepszym sposobem jest uchwycenie wydarzenia przejściowego, ale nie możemy w tej chwili ... Powiedz mi, czy ci pomogę, powodzenia!

4

bym do następujących rzeczy:

1. Rozszerz Fragment klasa
2. przesłonić onAttach() i onDetach() callbacks
3.Wdrożenie pokazywać i ukrywać oprogramowanie metoda klawiatury

przykładowy kod:

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