19

Czy istnieje sposób pokazania klawiatury programowej z podłączoną klawiaturą USB (w moim przypadku czytnik RFID)?
Próbowałem zmusić pokazać go za pomocą InputManager (z tych lub podobnych parametrach), ale bez powodzeniaWyświetl klawiaturę programową, mimo że podłączono klawiaturę sprzętową.

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

Ważna informacja - Wiem, że znajduje się przycisk w stanie/bar System, aby pokazać, ale ten przycisk nie jest widoczny dla użytkownika (aplikacja Kiosk).

+0

Mam również ten sam rodzaj problemu. Proszę, zasugeruj mi, jak to zrobić. Zastosowałem poniższy kod, ale wciąż nie działa softkeyboard. –

Odpowiedz

14

Trzeba zastąpić onEvaluateInputViewShown metody InputMethodService(), aby ocenić wartość true, nawet jeśli nie jest to trudne klawiatura. Zobacz onEvaluateInputShown() i sekcję Widok miękkiego wejścia InputMethodService. Spróbuj utworzyć własną niestandardową klasę InputMethodService, aby zastąpić tę metodę.

EDYCJA: Pomocne powinno być source for onEvaluateInputShown(). Rozwiązanie powinno być tak proste, jak stworzenie własnej klasy, która rozszerza InputMethodService i nadpisuje tę jedną metodę, która ma tylko kilka linii. Pamiętaj też o dodaniu niestandardowej usługi do manifestu.

Od Źródło:.

„Przestawianie to kontrolować, gdy miękki obszar wejściowy powinien być pokazany użytkownikowi Domyślna implementacja tylko pokazuje widok wejściowego, gdy nie ma twardy klawiatura lub klawiatura jest ukryty. Jeśli zmienisz to, co to zwróci, będziesz musiał sam wywołać funkcję updateInputViewShown(), gdy zwrócona wartość może zostać zmieniona, aby umożliwić jej ponowne oszacowanie i zastosowanie. "

public boolean onEvaluateInputViewShown() { 
    Configuration config = getResources().getConfiguration(); 
    return config.keyboard == Configuration.KEYBOARD_NOKEYS 
      || config.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_YES; 
} 

Here są możliwe konfiguracje można sprawdzić. Configuration.KEYBOARD_NOKEYS nie odpowiada żadnej klawiaturze sprzętowej. Ta metoda zwraca wartość true (powinna być wyświetlana klawiatura miękka), jeśli nie ma klawiatury sprzętowej lub jeśli klawiatura sprzętowa jest ukryta. Usunięcie obydwu tych sprawdzeń i po prostu zwrócenie wartości true powinno spowodować, że klawiatura oprogramowania będzie widoczna, nawet jeśli podłączona jest klawiatura sprzętowa.

Try (nie testowane):

public boolean onEvaluateInputViewShown() { 
    return true; 
} 

Od tej wartości zwracanej nie ulegnie zmianie, nie trzeba będzie zadzwonić updateInputViewShown() samodzielnie. Jeśli zmienisz tę metodę w inny sposób, pamiętaj o tym szczególe.

+0

W skrócie - muszę utworzyć własną InputMethodService prawie w ten sam sposób, w jaki chcę stworzyć własny układ klawiatury, menedżer będzie widoczny w ustawieniach systemu operacyjnego itd. Tak więc w moim przypadku użyję domyślnego Układ klawiatury Chciałbym uniknąć tej ścieżki, ale wygląda na to, że nie ma innej drogi, czy jest tam jakikolwiek "skrót"? – Warlock

+0

Najlepszym skrótem, jaki mogę wymyślić, jest stworzenie własnej klasy MyInputMethodService rozszerza InputMethodService i tylko nadpisuje onEvaluateInputViewShown() Jak już opisałem, nie powinieneś pisać innych metod, ponieważ są już w super klasie. Nie musisz tworzyć własnego układu klawiatury f lub to zadziała, jak domyślna klawiatura lub jakikolwiek styl klawiatury, który określisz za pomocą Androida: inputType będzie nadal używany. Możesz stworzyć swój własny, jeśli potrzebujesz go, aby wyglądał w pewien sposób, który nie jest jednym z ogólnych typów inputTypes. –

+0

Dzięki. Ta metoda działa! Nie mogłem znaleźć miejsca, w którym znajduje się domyślny układ klawiatury Androida itp., Więc użyłem próbki z SDK. Ale to była dość długa droga, by tylko przesłonić jedną z metod ;-) – Warlock

1

To działało w mojej aplikacji, co ciekawe, także aplikacja kiosku.

To jest trochę rozebrane, wcześniej zrobiłem kilka czeków, czy IMM ma wartość zerową i takie.

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0); 
+2

Tutaj nie ma zmiany :-(Co jeszcze dodałeś do tego kodu? W twoim przykładzie zmieniam tylko niektóreInputView na mój EditText i sprawdzam, czy imm nie ma wartości null.To wszystko wygląda dobrze, ale klawiatura się nie pojawiła.Dziękuję – Warlock

+2

Jeden też nie działa – Ehsan

2

Miękka klawiatura może mieć nieprzewidywalne zachowanie na różnych platformach. Najpierw w kodzie, upewnij się, że masz edytowalną kontrolę wejścia. Na przykład, jeśli masz EditText, można użyć:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) 
    .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED); 

Jednakże, można po prostu pokazać i ukryć go, kiedy tylko chcesz przy użyciu:

//show keyboard: 
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
//hide keyboard : 
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Można też dodać któregokolwiek z tych zdarzeń wewnątrz OnCreate lub inną metodą kontroli.

Jeśli jednak z jakiegoś powodu wystąpi jedna z powyższych sytuacji, najlepszą opcją może być użycie alternatywnej klawiatury, np. Compass Keyboard,

LUB

można nawet zbudować swoje:

zobaczyć example of a keyboard wdrażającego inputmethodservice.KeyboardView

kupili także spojrzeć na GingerBread Keyboard source.

+0

Nie działa. Próbowałem już "prostych" sposobów wyświetlania klawiatury. – Warlock

+0

Zaktualizowany, jeśli implementacja 'inputmethodservice.KeyboardView' zakończy się niepowodzeniem w używanej wersji Androida, to myślę, że możesz być * zmuszony do * budowania swojej. –

+0

Tak, to też nie działało dla mnie. – Ehsan

0

według tego https://stackoverflow.com/a/24287780/2233069, zrobiłem rozwiązanie robocze dla trybu Kiosk.

boolean hardwareKeyboardPlugged=false; 

.... 

mEditText.setOnFocusChangeListener(this);//in onCreate() 

.... 

@Override 
public void onResume() { 
    //protect from barcode scanner overriding keys 
    hardwareKeyboardPlugged=(getResources().getConfiguration().hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO); 

    super.onResume(); 
} 

.... 

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if (hasFocus) 
     if (hardwareKeyboardPlugged){ 
      //protect from barcode scanner overriding keys 
      hardwareKeyboardPlugged=false; 
      ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showInputMethodPicker(); 
      Toast.makeText(this, "USB device detected. Turn OFF hardware keyboard to enable soft keyboard!", Toast.LENGTH_LONG).show(); 
     } 
} 
Powiązane problemy