2013-05-22 22 views
10

http://developer.android.com/guide/topics/text/creating-input-method.html#GeneralDesign brzmi:Android: przełącznik do innego IME programowo

Ponieważ wiele IME może zostać zainstalowany na urządzeniu, zapewniają drogę dla użytkownika, aby przełączyć się do innego IME bezpośrednio z metody wprowadzania UI.

Załóżmy, że mam źródło dwóch metod wprowadzania i mogę go zmodyfikować. Chcę, aby użytkownik przełączał się między nimi szybko i jestem gotowy, aby zarezerwować przycisk do tego. Jak mogę "przejść do innego IME bezpośrednio z interfejsu użytkownika metody wprowadzania"?

Odpowiedz

13

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.

+0

ale jak uzyskać instancję klasy usług dla końcowego tokera IBinder = this.getWindow(). GetWindow(). GetAttributes(). Token; – Ram

+0

@Ram, jeśli twój projekt jest InputMethodService i jest aktualnie wybrany przez użytkownika To jest twoja usługa – 18446744073709551615

+0

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? –

10

Nie można zmienić aktualnego IME użytkownika za pomocą kodu ze względów bezpieczeństwa, przepraszam.

Można jednak wyświetlić okno dialogowe systemu, aby umożliwić użytkownikowi wybranie jednego z pozostałych włączonych.

InputMethodManager imeManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
if (imeManager != null) { 
    imeManager.showInputMethodPicker(); 
} else { 
    Toast.makeText(context ,"Error", Toast.LENGTH_LONG).show(); 
} 
+0

To dlaczego Google sugeruje, że należy to zrobić? – 18446744073709551615

+0

Średnia, aby wyświetlić okno dialogowe przełącznika, które będzie dostarczane przez system. Nie możesz tego zrobić bez wyświetlania tego okna dialogowego. –

+0

Jak mogę wywołać okno dialogowe tego przełącznika? Zauważ, że piszę metodę wprowadzania danych, a nie aplikację. – 18446744073709551615

Powiązane problemy