O introducere în Cadrul de verificare a ortografiei Android

Introducere

Dacă creați un IME personalizat (Editor de metode de introducere a textului) sau o aplicație de procesare a limbajului, puteți utiliza cadrul de verificare a ortografiei Android pentru a adăuga rapid funcția de verificare a ortografică în aplicația dvs., fără a trebui să faceți față unor sarcini de nivel scăzut, cum ar fi menținerea listelor de cuvinte determinând distanțele dintre cuvinte ale lui Damerau-Levenshtein.

Cadrul poate fi, de asemenea, utilizat pentru a crea o verificare de ortografie personalizată (de exemplu, pentru o nouă limbă sau pentru un domeniu specific) pe care alte aplicații le pot utiliza.

Acest tutorial vă arată mai întâi cum să utilizați cadrul pentru a interacționa cu verificatorul de ortografie implicit Android și apoi treceți pentru a acoperi elementele de bază ale dezvoltării unui personalizat.

1. Interacționează cu o verificare ortografică

Pasul 1: Creați un Activitate

Înainte de a ne arunca în cadru, să creați mai întâi un Activitate care pot afișa rezultatele verificărilor de ortografie.

Creați o nouă clasă Java numită SpellingsClient care se extinde Activitate. Această clasă trebuie să pună în aplicare și SpellCheckerSession.SpellCheckerSessionListener pentru a interacționa cu serviciile de verificare a ortografiei Android. În Android Studio, puteți apăsa Alt + Insert pentru a genera automat stubs gol pentru metodele de interfață.

Ca asta Activitate va avea doar unul TextView în aspectul său, nu este necesar să creați un aspect XML pentru acesta. Împingeți onCreate - metoda de inițializare a TextView și trimiteți-l la setContentView astfel încât aceasta să ia întreg ecranul.

În acest moment, clasa dvs. ar trebui să arate astfel:

clasa publică SpellingsClient extinde Activitatea implementează SpellCheckerSession.SpellCheckerSessionListener private TextView suggestions; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); Sugestii = TextView nou (acest); setContentView (sugestii);  @Override public void onGetSuggestions (sugestiiInfo [] rezultate)  @Override public void onGetSentenceSuggestions (Rezultatele SentenceSuggestionsInfo []) 

Pasul 2: Trimiteți date către verificatorul de vrăji implicit

Să trecem acum o propoziție care conține mai multe cuvinte greșite în greșeală pentru verificatorul de ortografie implicit pentru Android. Creați o metodă numită fetchSuggestionsFor care acceptă a Şir ca parametru.

private void fetchSuggestionsFor (intrare cu șir) 

Deoarece verificatorul ortografiei Serviciu face parte din Servicii text API, trebuie să utilizați getSystemService - metoda de recuperare a unei instanțe TextServicesManager. Apoi puteți apela newSpellCheckerSession metoda de a crea un nou sesiune, care poate fi folosit pentru a trimite date la verificatorul de ortografie. Adăugați următorul cod la metodă:

TextServicesManager tsm = (TextServicesManager) getSystemService (TEXT_SERVICES_MANAGER_SERVICE); Sesiunea SpellCheckerSession = tsm.newSpellCheckerSession (null, Locale.ENGLISH, this, true);

Asigurați-vă că locale treci la newSpellCheckerSession se potrivește cu limba propoziției introduse.

Acum, că sesiune este gata, puteți apela getSentenceSuggestions pentru a primi sugestii de ortografie pentru una sau mai multe propoziții.

getSentenceSuggestions metoda ia doi parametri. Primul parametru este o matrice de TextInfo obiecte. Utilizați constructorul TextInfo clasa pentru a converti a Şir intr-o TextInfo obiect. Al doilea parametru este un int care specifică numărul de sugestii care ar trebui generate. Pentru acest exemplu, permiteți-ne să-l setăm 5.

Adăugați următorul cod la metodă:

session.getSentenceSuggestions (nou TextInfo [] new TextInfo (input), 5);

În cele din urmă, sună fetchSuggestionsFor în onCreate metodă a Activitate.

// Trimiterea unei propoziții care conține două cuvinte / cuvinte greșite fetchSuggestionsFor ("Peter trăiește în Brlin");

Rețineți că getSentenceSuggestions metoda a fost introdusă în nivelul API 16. Versiunile anterioare ale API au folosit versiunea anterioară, fiind acum depreciate, getSuggestions metodă.

Pasul 3: Afișați sugestiile

getSentenceSuggestions metoda interacționează cu verificatorul de ortografie în mod asincron. Când sugestiile au fost generate, onGetSentenceSuggestions se numește metoda.

Sugestiile pentru fiecare teză de intrare sunt disponibile într-o secțiune separată SentenceSuggestionsInfo obiect. Fiecare SentenceSuggestionsInfo obiect conține multiple SuggestionsInfo obiecte, de obicei pentru fiecare cuvânt al propoziției. Fiecare SuggestionsInfo obiect conține sugestiile reale pentru un cuvânt sub formă de Şir obiecte.

Pentru acest exemplu, să purtăm pur și simplu toate sugestiile și să le adăugăm la a StringBuffer. Utilizare getSuggestionsCount pentru a determina numărul de sugestii disponibile și getSuggestionInfoAt pentru a obține o referință la un anumit SuggestionInfo.

Adăugați următorul cod la onGetSentenceSuggestions metodă:

final StringBuffer sb = nou StringBuffer (""); pentru (rezultatul SentenceSuggestionsInfo: rezultate) int n = result.getSuggestionsCount (); pentru (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");  

Acum puteți folosi TextView„s setText metoda de a face conținutul StringBuffer. Cu toate acestea, nu puteți apela metoda direct, deoarece onGetSentenceSuggestions se execută pe firul propriu. Încercarea de a face modificări în interfața de utilizator dintr-un fir non-UI va duce la o excepție de rulare. Prin urmare, asigurați-vă că apelați setText din interiorul runOnUiThread metodă.

runOnUiThread (noul Runnable () @Override public void run () suggestions.setText (sb.toString ()););

Dacă rulați aplicația acum, rezultatul va arăta astfel:

După cum vedeți, aplicația noastră arată în prezent sugestii pentru toate cuvintele din propoziție, chiar și pentru cele cu ortografie corectă.

Pentru a afișa sugestii numai pentru cuvinte greșite, trebuie să ne uităm la steagurile asociate cu fiecare SuggestionsInfo obiect. A SuggestionsInfo obiect pentru un cuvânt greșit scrise are RESULT_ATTR_LOOKS_LIKE_TYPO set de pavilioane. Prin urmare, trebuie să adăugăm un cod de ignorat SuggestionsInfo obiecte unde acest steag nu este setat.

Adăugați următorul cod la onGetSentenceSuggestions înainte de a începe buclele interioare:

dacă ((result.getSuggestionsInfoAt (i) .getSuggestionsAttributes () & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO)! = SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) continuați;

Rulați aplicația din nou pentru a vedea ieșirea modificată.

2. Crearea unei verificări personalizate a vrăjitorilor

Acum, că știți cum să interacționați cu verificatorul de ortografie implicit, permiteți-ne să creăm o verificare de ortografie personalizată.

Pasul 1: Creați un Serviciu

Creați o nouă clasă Java numită SpellingService. Pentru ca o clasă să fie tratată ca o verificare de ortografie de către sistemul Android, trebuie să se extindă SpellCheckerService clasa și suprascrie createSession metodă.

Adăugați următorul cod la SpellingService.java:

clasa publică SpellingService extinde SpellCheckerService @Override public Session createSession () 

Pasul 2: Creați o sesiune

Toate logica personalizată de verificare a ortografiei se află în Sesiune. Creați o nouă clasă numită MySpellingSession care se extinde Sesiune. Puteți să-l creați ca o subclasă de SpellingService.

 Sesiune clasa este o clasă abstractă. După ce eliminați toate metodele abstracte, clasa dvs. ar trebui să arate astfel:

clasa MySpellingSession extinde Sesiunea @Override public void onCreate ()  @Override publică SuggestionsInfo onGetSuggestions (TextInfo textInfo, int suggestionsLimit)  @Override public SentenceSuggestionsInfo [] onGetSentenceSuggestionsMultiple (TextInfo [] textInfos, int suggestionsLimit) 

Pentru acest tutorial, permiteți-ne să creăm o verificare de ortografie foarte simplă, care are următoarele caracteristici:

  • Tratează cuvântul "Petru" ca o greșeală.
  • Se întoarce cinci spell-uri alternative pentru cuvântul "Peter".

Codul pentru implementarea acestor funcții poate fi adăugat la onGetSuggestions pentru că se presupune că se ocupă de cuvinte individuale (sub formă de a TextInfo obiecte).

Extrageți cuvântul folosind getText și verificați dacă este egal cu "Peter". Dacă este, adăugați sugestiile adecvate la o matrice de Şir obiecte. Dacă nu este, păstrați matricea goală.

În cele din urmă, creați și returnați un nou SuggestionsInfo obiect care conține gama de sugestii împreună cu steagul RESULT_ATTR_LOOKS_LIKE_TYPO. Codul real ar putea arăta astfel:

Cuvantul cuvant = textInfo.getText (); Sugestii de șir [] = null; dacă word.equals ("Peter")) sugestii = nou String [] "Pedro", "Pietro", "Petar", "Pierre", "Petrus";  altceva sugsions = new String [] ;  SuggestionsInfo suggestionsInfo = SugestiiInfo noi (sugestiiInfo.RESULT_ATTR_LOOKS_LIKE_TYPO, sugestii); retur sugestiiInfo;

Nu am terminat încă. SpellingsClient clasa pe care am creat-o mai devreme a transmis fraze întregi la verificatorul de ortografie, nu la cuvintele individuale. Asta inseamna onGetSuggestions metoda nu va fi chemată direct. Prin urmare, trebuie să scriem un cod care să împartă propozițiile în cuvinte și să le transmită ca argumente pentru onGetSuggestions metodă. Acest cod trebuie adăugat la onGetSentenceSuggestionsMultiple metodă.

Iată ce faceți în cazul onGetSentenceSuggestionsMultiple metodă:

  • Faceți buclă prin TextInfo obiectele pe care le primește ca intrare și convertește fiecare propoziție într - o serie de cuvinte folosind Despică metodă.
  • Transformați fiecare cuvânt în a TextInfo obiecte și să le transmită ca argument la onGetSuggestions metodă.
  • Adăugați sugestiile returnate la un ArrayList de SuggestionsInfo obiecte.
  • Creați și returnați o nouă serie de SentenceSuggestionsInfo obiecte utilizând ArrayList de SuggestionsInfo obiecte.

Adăugați următorul cod la onGetSentenceSuggestionsMultiple metodă:

Listă sugestiiInfos = noul ArrayList <> (); pentru (int i = 0; i

Acum obiceiul Sesiune clasa este gata, creați și returnați o instanță a acestuia în serviciul createSession metodă:

returnează noua MySpellingSession ();

Pasul 3: Creați metadatele pentru serviciu

Creați un nou fișier XML numit spellinginfo.xml în res / xml pliant. Acest fișier este utilizat de sistemul Android pentru a determina numele verificatorului ortografic și limbile pe care le acceptă. Să ne sunăm la verificatorul de ortografie Verificatorul meu de vrăji. Adăugați în fișier următorul cod:

    

Actualizați-vă Valorile / strings.xml așa că a existat SERVICE_LABEL:

Verificatorul meu de vrăji

Pasul 4: Actualizați Manifestul

Orice Serviciu care vrea să se comporte ca un verificator de ortografie trebuie să solicite android.permission.BIND_TEXT_SERVICE și să răspundă la android.service.textservice.SpellCheckerService acțiune. De asemenea, ar trebui să conțină o referință la XML-ul metadatelor pe care l-am definit în pasul anterior. Defini SpellingService prin adăugarea următorului cod la dvs. AndroidManifest.xml:

     

Pasul 5: Activați noua verificare a ortografiei

Dacă compilați și rulați aplicația acum, nu veți vedea nici o diferență în ieșirea dvs. Activitate. Acest lucru se datorează faptului că încă utilizează verificatorul de ortografie implicit Android. Pentru a activa verificatorul de vrăji personalizat, accesați Setări aplicație și alegeți verificatorul ortografic în Limba și intrarea secțiune.

Odată activat, dacă reporniți aplicația, veți vedea sugestii numai pentru cuvântul "Peter".

Concluzie

În acest tutorial, ați învățat cum să comunicați cu serviciile de verificare a ortografiei Android pentru a efectua operații de verificare ortografică în aplicația dvs. De asemenea, ați învățat cum să vă creați propria verificare de ortografie personalizată. Puteți utiliza aceste cunoștințe pentru a crea nu numai IME-uri mai bune, ci și verificatori de ortografie pentru limbi care în prezent nu sunt acceptate de Android în mod implicit. Pentru a afla mai multe despre API-ul TextServices și Cadrul de verificare a ortografiei, consultați Referința dezvoltatorilor Android.

Cod