2013-05-22 15 views
10

http://developer.android.com/guide/topics/text/creating-input-method.html#GeneralDesign legge:Android: passa a un diverso livello di programmazione IME

Poiché più IMEs possono essere installati sul dispositivo, fornire un modo per l'utente di passare a un diverso IME direttamente dal metodo di input utente.

Supponiamo di avere l'origine di due metodi di input e di poterlo modificare. Voglio consentire all'utente di passare da una all'altra rapidamente e sono pronto a prenotare un pulsante per quello. Come faccio a "" passare a un IME diverso direttamente dall'interfaccia utente del metodo di input "?

risposta

13

Il passaggio al metodo di immissione precedente dal metodo di immissione di corrente è:

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

Se si desidera passare a un particolare metodo di input il cui ID si sa, si può fare come le linee commentate suggeriscono.

EDIT @pRaNaY ha suggerito un singolo .getWindow() in una modifica silenziosa (fai clic su "modificato" sotto per vedere la cronologia). Ricordo che non funzionava per Android 2.3; se si consultano i documenti, si vedrà che la prima chiamata, InputMethodService.getWindow() restituisce un Dialog (che non è una sottoclasse di Window) e la seconda chiamata, Dialog.getWindow() restituisce un Window. Non c'è Dialog.getAttributes(), quindi con un singolo .getWindow() non verrà nemmeno compilato.

+0

ma come ottenere l'istanza della classe di servizio per il token finale IBinder = this.getWindow(). GetWindow(). GetAttributes(). Token; – Ram

+0

@Ram se il progetto è un InputMethodService ed è attualmente selezionato dall'utente , questo è il tuo servizio – 18446744073709551615

+0

Sono confuso, questa soluzione non contraddice ciò che @Raghav Sood stava dicendo - che per motivi di sicurezza non è permesso? –

10

Non è possibile modificare l'IME attualmente attivo tramite codice per motivi di sicurezza, mi dispiace.

Tuttavia, è possibile visualizzare una finestra di dialogo fornita dal sistema per consentire all'utente di selezionare una delle altre abilitate.

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

Allora perché Google suggerisce che dovrebbe essere fatto? – 18446744073709551615

+0

Media per mostrare una finestra di dialogo dello switcher, che verrà fornita dal sistema. Non puoi farlo senza mostrare questa finestra di dialogo. –

+0

Quindi come invoco la finestra di dialogo di questo switcher? Si noti che sto scrivendo un metodo di input, non un'applicazione. – 18446744073709551615

Problemi correlati