Se stai creando un IME personalizzato (Input Method Editor) o un'app di elaborazione del linguaggio, puoi utilizzare il correttore ortografico di Android per aggiungere rapidamente funzionalità di controllo ortografico alla tua app senza dover affrontare attività di basso livello, come il mantenimento di elenchi di parole o determinare le distanze di Damerau-Levenshtein tra le parole.
Il framework può anche essere utilizzato per creare un correttore ortografico personalizzato (ad esempio per una nuova lingua o per un dominio specifico) che altre app possono utilizzare.
Questo tutorial mostra in primo luogo come utilizzare il framework per interagire con il correttore ortografico predefinito di Android, quindi passa a comprendere le basi per lo sviluppo di un correttore ortografico personalizzato.
Attività
Prima di immergerci nel framework, creiamo prima un Attività
in grado di visualizzare i risultati dei controlli ortografici.
Crea una nuova classe Java chiamata SpellingsClient quello si estende Attività
. Questa classe deve anche implementare il SpellCheckerSession.SpellCheckerSessionListener
interfaccia per interagire con i servizi di controllo ortografico di Android. In Android Studio, puoi premere Alt + Ins generare automaticamente stub vuoti per i metodi dell'interfaccia.
Come questo Attività
ne avrà solo uno TextView
nel suo layout, non è necessario creare un XML di layout per questo. Ignora il onCreate
metodo per inizializzare il TextView
e passalo al setContentView
metodo in modo che occupi l'intero schermo.
A questo punto, la tua classe dovrebbe assomigliare a questa:
public class SpellingsClient estende Activity implements SpellCheckerSession.SpellCheckerSessionListener suggerimenti TextView privati; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); suggerimenti = nuovo TextView (questo); setContentView (suggerimenti); @Override public void onGetSuggestions (SuggestionsInfo [] results) @Override public void onGetSentenceSuggestions (SentenceSuggestionsInfo [] results)
Passiamo ora a una frase contenente più parole digitate erroneamente al correttore ortografico predefinito di Android. Crea un metodo chiamato fetchSuggestionsFor che accetta un Stringa
come parametro.
private void fetchSuggestionsFor (input per stringhe)
Perché il correttore ortografico Servizio
è una parte del Servizi di testo API, devi usare il getSystemService
metodo per recuperare un'istanza di TextServicesManager
. Puoi quindi chiamare il newSpellCheckerSession
metodo per creare un nuovo sessione
, che può essere utilizzato per inviare dati al correttore ortografico. Aggiungi il seguente codice al metodo:
TextServicesManager tsm = (TextServicesManager) getSystemService (TEXT_SERVICES_MANAGER_SERVICE); SpellCheckerSession session = tsm.newSpellCheckerSession (null, Locale.ENGLISH, this, true);
Assicurati che il località
tu passi newSpellCheckerSession
corrisponde alla lingua della frase inserita.
Ora che il sessione
è pronto, puoi chiamare getSentenceSuggestions
per ottenere suggerimenti di ortografia per una o più frasi.
Il getSentenceSuggestions
il metodo richiede due parametri. Il primo parametro è un array di TextInfo
oggetti. Tu usi il costruttore del TextInfo
classe per convertire a Stringa
in un TextInfo
oggetto. Il secondo parametro è un int
che specifica il numero di suggerimenti che dovrebbero essere generati. Per questo esempio, impostiamolo su 5.
Aggiungi il seguente codice al metodo:
session.getSentenceSuggestions (new TextInfo [] new TextInfo (input), 5);
Infine, chiama fetchSuggestionsFor
nel onCreate
metodo del Attività
.
// Passando una frase che contiene due // parole errate fetchSuggestionsFor ("Peter livs in Brlin");
Si noti che il getSentenceSuggestions
il metodo è stato introdotto nel livello API 16. Le versioni precedenti dell'API utilizzavano, ora deprecate, getSuggestions
metodo.
Il getSentenceSuggestions
il metodo interagisce con il correttore ortografico in modo asincrono. Quando i suggerimenti sono stati generati, il onGetSentenceSuggestions
il metodo è chiamato.
I suggerimenti per ogni frase introduttiva sono disponibili separatamente SentenceSuggestionsInfo
oggetto. Ogni SentenceSuggestionsInfo
l'oggetto contiene più SuggestionsInfo
oggetti, di solito per ogni parola della frase. Ogni SuggestionsInfo
oggetto contiene i suggerimenti effettivi per una parola sotto forma di Stringa
oggetti.
Per questo esempio, analizziamo semplicemente tutti i suggerimenti e li aggiungiamo a StringBuffer
. Uso getSuggestionsCount
per determinare il numero di suggerimenti disponibili e getSuggestionInfoAt
per ottenere un riferimento a un particolare SuggestionInfo
.
Aggiungi il seguente codice al onGetSentenceSuggestions
metodo:
final StringBuffer sb = new StringBuffer (""); for (SentenceSuggestionsInfo result: results) int n = result.getSuggestionsCount (); per (int i = 0; i < n; i++) int m = result.getSuggestionsInfoAt(i).getSuggestionsCount(); for(int k=0; k < m; k++) sb.append(result.getSuggestionsInfoAt(i).getSuggestionAt(k)) .append("\n"); sb.append("\n");
Ora puoi usare il TextView
'S setText
metodo per rendere il contenuto del StringBuffer
. Tuttavia, non è possibile chiamare direttamente il metodo, perché onGetSentenceSuggestions
gira sul proprio thread. Il tentativo di apportare modifiche nell'interfaccia utente da un thread non UI porterà a un'eccezione di runtime. Pertanto, assicurati di chiamare il setText
metodo dall'interno del runOnUiThread
metodo.
runOnUiThread (new Runnable () @Override public void run () suggestions.setText (sb.toString ()););
Se esegui la tua app ora, l'output sarà simile a questo:
Come puoi vedere, la nostra app sta attualmente mostrando suggerimenti per tutte le parole della frase, anche per quelle con la corretta ortografia.
Per mostrare solo suggerimenti per le parole errate, dovremo guardare le bandiere associate a ciascuna SuggestionsInfo
oggetto. UN SuggestionsInfo
oggetto per una parola errata ha il RESULT_ATTR_LOOKS_LIKE_TYPO
bandiera impostata. Pertanto, dobbiamo aggiungere codice da ignorare SuggestionsInfo
oggetti in cui questo flag non è impostato.
Aggiungi il seguente codice al onGetSentenceSuggestions
metodo prima che inizi il ciclo più interno:
if ((result.getSuggestionsInfoAt (i) .getSuggestionsAttributes () & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO)! = SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) continua;
Esegui nuovamente l'app per vedere l'output modificato.
Ora che sai come interagire con il correttore ortografico di default, passiamo alla creazione di un correttore ortografico personalizzato.
Servizio
Crea una nuova classe Java chiamata SpellingService. Affinché una classe venga trattata come un correttore ortografico dal sistema Android, è necessario estenderla SpellCheckerService
classe e scavalcare il createSession
metodo.
Aggiungere il seguente codice a SpellingService.java:
public class SpellingService estende SpellCheckerService @Override public Session createSession ()
Tutta la logica di controllo ortografico personalizzata risiede nel Sessione
. Crea una nuova classe chiamata MySpellingSession quello si estende Sessione
. Puoi crearlo come sottoclasse di SpellingService
.
Il Sessione
la classe è una classe astratta. Dopo aver scavalcato tutti i metodi astratti, la tua classe dovrebbe assomigliare a questa:
classe MySpellingSession estende Session @Override public void onCreate () @Override public SuggestionsInfo onGetSuggestions (TextInfo textInfo, int suggestionsLimit) @Override public SentenceSuggestionsInfo [] onGetSentenceSuggestionsMultiple (TextInfo [] textInfos, int suggestionsLimit)
Per questo tutorial, creiamo un correttore ortografico molto semplice che abbia le seguenti caratteristiche:
Il codice per implementare queste funzionalità può essere aggiunto al onGetSuggestions
metodo, perché dovrebbe gestire singole parole (nella forma di a TextInfo
oggetti).
Estrai la parola usando il getText
metodo e verificare se è uguale a "Peter". Se lo è, aggiungi i suggerimenti appropriati a un array di Stringa
oggetti. Se non lo è, mantieni l'array vuoto.
Infine, crea e restituisci un nuovo SuggestionsInfo
oggetto che contiene la matrice di suggerimenti insieme alla bandiera RESULT_ATTR_LOOKS_LIKE_TYPO
. Il codice effettivo potrebbe assomigliare a questo:
Parola stringa = textInfo.getText (); Suggerimenti per le stringhe [] = null; if (word.equals ("Peter")) suggestions = new String [] "Pedro", "Pietro", "Petar", "Pierre", "Petrus"; else suggestions = new String [] ; SuggerimentiInfo suggerimentiInfo = new SuggestionsInfo (SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO, suggerimenti); suggerimenti di ritornoInfo;
Non abbiamo ancora finito. Il SpellingsClient
la classe che abbiamo creato in precedenza ha passato intere frasi al correttore ortografico, non singole parole. Ciò significa il onGetSuggestions
il metodo non verrà mai chiamato direttamente. Pertanto, abbiamo bisogno di scrivere un codice che possa dividere le frasi in parole e passarle come argomenti al onGetSuggestions
metodo. Questo codice deve essere aggiunto al onGetSentenceSuggestionsMultiple
metodo.
Ecco cosa fai in onGetSentenceSuggestionsMultiple
metodo:
TextInfo
oggetti che riceve come input e converte ogni frase in una serie di parole usando il Diviso
metodo.TextInfo
oggetto e passarlo come argomento al onGetSuggestions
metodo.Lista di array
di SuggestionsInfo
oggetti.SentenceSuggestionsInfo
oggetti che usano il Lista di array
di SuggestionsInfo
oggetti.Aggiungi il seguente codice al onGetSentenceSuggestionsMultiple
metodo:
ElencosuggestionsInfos = new ArrayList <> (); per (int i = 0; i Ora che l'abitudine
Sessione
la classe è pronta, crea e restituisce un'istanza di essa nel serviziocreateSession
metodo:restituisce il nuovo MySpellingSession ();Passaggio 3: creare i metadati per il servizio
Crea un nuovo file XML chiamato spellinginfo.xml nel res / xml cartella. Questo file viene utilizzato dal sistema Android per determinare il nome del correttore ortografico e le lingue supportate. Chiamiamo il nostro correttore ortografico Il mio correttore ortografico. Aggiungi il seguente codice al file:
Aggiorna il tuo Valori / strings.xml così che abbia
SERVICE_LABEL
:Il mio correttore ortografico Passaggio 4: aggiornare il manifest
Qualunque
Servizio
che vuole comportarsi come un correttore ortografico deve richiedere ilandroid.permission.BIND_TEXT_SERVICE
permesso e rispondere alandroid.service.textservice.SpellCheckerService
azione. Dovrebbe anche contenere un riferimento all'XML dei metadati definito nel passaggio precedente. DefinireSpellingService
aggiungendo il seguente codice al tuo AndroidManifest.xml:Passaggio 5: attiva il nuovo correttore ortografico
Se compili ed esegui la tua app ora, non vedrai differenze nell'output del tuo
Attività
. Questo perché sta ancora utilizzando il correttore ortografico predefinito di Android. Per attivare il correttore ortografico personalizzato, vai al impostazioni app e scegli il tuo correttore ortografico in Lingua ed inserimento sezione.Una volta attivato, se si riavvia l'app, verranno visualizzati suggerimenti solo per la parola "Peter".
Conclusione
In questo tutorial, hai imparato come comunicare con i servizi di correttore ortografico di Android per eseguire operazioni di controllo ortografico nella tua app. Hai anche imparato a creare il tuo correttore ortografico personalizzato. Puoi utilizzare questa conoscenza per creare non solo IME migliori, ma anche correttori ortografici completi per le lingue che attualmente non sono supportate da Android per impostazione predefinita. Per saperne di più sull'API TextServices e sul framework Spelling Checker, consultare la Guida per gli sviluppatori Android.