Przejście do poprzedniej metody wprowadzania od aktualnej metody wprowadzania jest:
//final String LATIN = "com.android.inputmethod.latin/.LatinIME";
// 'this' is an InputMethodService
try {
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
final IBinder token = this.getWindow().getWindow().getAttributes().token;
//imm.setInputMethod(token, LATIN);
imm.switchToLastInputMethod(token);
} catch (Throwable t) { // java.lang.NoSuchMethodError if API_level<11
Log.e(TAG,"cannot set the previous input method:");
t.printStackTrace();
}
Jeśli chcesz przejść do konkretnej metody wprowadzania której identyfikator znasz, możesz to zrobić jako sugerowane linie komentarza.
EDIT @pRaNaY zasugerował pojedyncze .getWindow()
w edycji cichej (kliknij "edytowane" poniżej, aby zobaczyć historię). Pamiętam, że nie działało na Androida 2.3; jeśli przejrzysz dokumentację, zobaczysz, że pierwsze wywołanie, InputMethodService.getWindow()
zwraca Dialog
(która nie jest podklasą Window
), a drugie wywołanie, Dialog.getWindow()
zwraca Window
. Nie ma numeru Dialog.getAttributes()
, więc przy pojedynczym .getWindow()
nie będzie on nawet kompilowany.
ale jak uzyskać instancję klasy usług dla końcowego tokera IBinder = this.getWindow(). GetWindow(). GetAttributes(). Token; – Ram
@Ram, jeśli twój projekt jest InputMethodService i jest aktualnie wybrany przez użytkownika To jest twoja usługa – 18446744073709551615
Jestem zdezorientowany, czy to rozwiązanie nie jest sprzeczne z tym, co mówił @Raghav Sood - że ze względów bezpieczeństwa jest to niedozwolone? –