2012-12-04 14 views
23

showSoftInput() nie pokazuje klawiatury dla mnie, ale robi to toggleSoftInput(). Widziałem inny post, który powiedział, aby wyłączyć twardą klawiaturę podczas korzystania z emulatora, ale nie używam emulatora. Wczytuję mój plik APK w rzeczywiste urządzenie bez twardej klawiatury. Czy obie metody nie powinny działać? Dlaczego nie działa showSoftInput()? Chciałbym wyraźnie skojarzyć klawiaturę z określonym polem tekstowym.Android softkeyboard showSoftInput vs toggleSoftInput

nie działa:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
editText.setText("textchange"); //i see the text field update 
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); 

działa:

InputMethodManager imm = (InputMethodManager) getDelegate().getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 
+0

Wymyśliłeś to? Spędziłem już 3 dni na tym problemie. Jeśli spróbuję użyć przełącznika, klawiatura czasami się ukryje, ponieważ jest już widoczna. I oczywiście Android nie uważa, że ​​konieczne jest, abyśmy mogli zapytać, czy softinput jest widoczny, czy nie. – bgolson

Odpowiedz

1

Spróbuj tego:

public void showTheKeyboard(Context context, EditText editText){ 
    InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 
} 

Jeśli to nie zadziała przeczytać tutorial z here

+1

musiałem się włączyć. Z jakiegoś powodu program showSoftInput nie działał dla mnie. – prostock

+0

To działa idealnie dla mnie. Dzięki! –

17

Wydaje się że klawiatura jest początkowo wyświetlana ale ukryte przez coś innego, ponieważ następujące prace (ale w rzeczywistości jest brudny obejście):

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
editText.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     editText.requestFocus(); 
     imm.showSoftInput(editText, 0); 
    } 
}, 100); 

I patrząc na LogCat Podejrzewam, że jego przyczyną tej wiadomości ukrywa klawiaturę początkowo pokazano:

Ukryj okno dialogowe Schowek na wejściu początkowym: ukończone przez kogoś innego ...!

+1

To jest właściwie jedyna rzecz, która sprawdziła się przy próbie pokazania klawiatury w programie onCreate. Chciałbym wiedzieć dlaczego. dzięki i tak .. –

+0

Miałem podobny problem. Został rozwiązany. dzięki –

+0

Dobra sztuczka, dzięki. – Lev

2

Dokładna odpowiedź na to pytanie, dlaczego program showSoftInput nie działa, a toggleSoftInput robi?

Czy ten widok, na który próbujesz wyświetlić klawiaturę, nie jest aktywny. Tak, aby rozwiązać ten problem i użyć metody showSoftInput trzeba będzie zadzwonić następujących metod na widoku:

setFocusable(true); 
    setFocusableInTouchMode(true); 

wywołaniem powyższych metod będzie upewnić się, że po kliknięciu na Widoku zachowuje i zrzuty ostrość.

+0

Dokładna odpowiedź powinna przynajmniej pokazać przykład ... ponieważ nie zadziałała! –

4

Pokaż klawiatura + ostrości, a także jeśli chcesz ukryć klawiaturę

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

    inputSearch.setFocusableInTouchMode(true); 
    inputSearch.requestFocus(); 

    // Show Keyboard 
    InputMethodManager imm = (InputMethodManager) getSherlockActivity().getSystemService(
      Context.INPUT_METHOD_SERVICE); 
    imm.showSoftInput(inputSearch, InputMethodManager.SHOW_IMPLICIT); 
} 

P.S inputSearch = (EditText) getSherlockActivity(). FindViewById (R.id.inputSearch);

// Hide Keyboard 
InputMethodManager imm = (InputMethodManager) getSherlockActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(inputSearch.getWindowToken(), 0); 
1
public void hideKeyboard() { 
    myTextView.setFocusable(true); 
    myTextView.setFocusableInTouchMode(true); 
    imm.hideSoftInputFromWindow(myTextView.getWindowToken(), 0); 
} 

WORKS

public void hideKeyboard() { 
    imm.hideSoftInputFromWindow(myTextView.getWindowToken(), 0); 
} 

NIE DZIAŁA

imm jest rozpatrywane wcześniej jako Używam fragment tak:

Declare IMM we fragmencie

private InputMethodManager imm; 

Następnie w dodatku fragment:

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    imm = (InputMethodManager) 
    getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
} 

Mówi po 3 do 4 godzin badań i niepowodzeń! !

Dzięki user_CC! :-)

Phil

+0

FWIW, musiałem przeczytać to dwa razy, zanim upewniłem się, że jest to pierwszy fragment kodu, który działa - byłby bardziej przejrzysty, gdyby umieścić "WORKS:" POWYŻSZY pierwszy fragment i "NIE DZIAŁA:" POWYŻEJ drugiego fragmentu. – ToolmakerSteve

0

ShowSoftInput działa, jeśli widok cel IMM jest samo z EditText. Możesz to sprawdzić przez imm.isActive(editText) lub editText.isInputMethodTarget().

ToggleSoftInput to przełączanie klawiatury bieżącego celu imm.

Widok celu imm zostaje ustawiony po zmianie ostrości przez editText.requestFocus(). Wydaje mi się, że między tymi dwoma zadaniami istnieją procesy postne, ponieważ nie wystarczyło uruchomienie jednego postu. Przetestowałem podwójny post i zadziałało to dla mnie.

editText.requestFocus(); 
editText.post(new Runnable() { 
    @Override 
    public void run() { 
     editText.post(new Runnable() { 
      @Override 
      public void run() { 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       if (imm != null) { 
        imm.showSoftInput(editText, 0); 
       } 
      } 
     }); 
    } 
});