En introduksjon til Androids stavekontroll Framework

An Introduksjon til Android er stavekontroll Work
23
Del
to
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Innledning

Hvis du oppretter en tilpasset IME (Input Method Editor) eller en språkbehandling app, kan du bruke Android er stavekontrollen rammeverk for å raskt legge til stavekontroll funksjonalitet til programmet uten å måtte forholde seg til lavt nivå oppgaver, for eksempel å opprettholde ordlister eller bestemme Damerau-Levenshtein avstander mellom ord.

Rammen kan også brukes til å lage en ny tilpasset spell kontrolløren (si for et nytt språk eller for et bestemt domene) som andre apps kan bruke.

Denne opplæringen først viser deg hvordan du skal bruke rammeverket til å samhandle med Android standard stavekontroll, og deretter går videre å dekke grunnleggende for å utvikle en tilpasset stavekontroll.

1. Samspill med en stavekontroll

Trinn 1:. Opprett en aktivitet

Før vi dykke inn i rammen, la oss først opprette en aktivitet som kan vise resultatene av stavekontroll

Opprett en ny Java klasse kalt SpellingsClient som strekker aktivitet. Denne klassen må også implementere SpellCheckerSession.SpellCheckerSessionListener grensesnitt for å samhandle med Android stavekontroll tjenester. I Android Studio, kan du trykke Alt + Sett for å automatisk generere tomme stubber for metodene i grensesnittet.

Som denne aktiviteten kommer til å ha bare én TextView i oppsettet, du trenger ikke å lage et oppsett XML for det. Overstyre onCreate metode for å initialisere TextView og gi det til setContentView metode, slik at det tar opp hele skjermen

På dette punktet, bør klassen din se slik ut:.
Public class SpellingsClient strekker aktivitet implementerer SpellCheckerSession.SpellCheckerSessionListener {private TextView forslag; Override Beskyttet void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); forslag = new TextView (denne); setContentView (forslag); }Override Public void onGetSuggestions (SuggestionsInfo [] resultater) {}Override public void onGetSentenceSuggestions (SentenceSuggestionsInfo [] resultater) {}}
Trinn 2: Send data til Misligholdet Spell Checker

La oss nå passere en setning som inneholder flere feilstavede ord til Android standard stavekontroll. Lag en metode som heter fetchSuggestionsFor som aksepterer en String som parameter.
Private void fetchSuggestionsFor (String input) {}

Fordi stavekontroll Tjenesten er en del av teksten Services API, må du bruke den getSystemService metode for å hente en forekomst av TextServicesManager. Du kan deretter ringe newSpellCheckerSession metode for å lage en ny økt, noe som kan brukes til å sende data til stavekontrollen. Legg til følgende kode i metoden:
TextServicesManager TSM = (TextServicesManager) getSystemService (TEXT_SERVICES_MANAGER_SERVICE); SpellCheckerSession session = tsm.newSpellCheckerSession (null, Locale.ENGLISH, dette, true);

Sørg for at Locale du sender til newSpellCheckerSession kamper språket ditt innspill setning.

Nå som økten er ferdig, kan du ringe getSentenceSuggestions å få forslag til stavemåter for en eller flere setninger.

getSentenceSuggestions metoden tar to parametre. Den første parameteren er en rekke TextInfo stedene. Du bruker konstruktøren av TextInfo klassen til å konvertere en streng til en TextInfo objekt. Den andre parameteren er en int som angir antall forslag som skal genereres. For dette eksempelet, la oss sette det til 5.

Legg til følgende kode i metoden:
session.getSentenceSuggestions (ny TextInfo [] {nytt TextInfo (input)}, 5);

Til slutt ringe fetchSuggestionsFor i onCreate metode for aktiviteten
//Passerer en setning som har to //feilstavede wordsfetchSuggestionsFor ("Peter livs i Brlin");.

Merk at getSentenceSuggestions metoden ble introdusert i API nivå 16. Tidligere versjoner av API brukt, nå frarådet, getSuggestions metode

Trinn 3:. Vise forslag

getSentenceSuggestions metode samhandler med stavekontrollen asynkront. Når forslagene har blitt generert, er onGetSentenceSuggestions metode som kalles.

Forslag til hver inngang setning er tilgjengelig i en egen SentenceSuggestionsInfo objekt. Hver SentenceSuggestionsInfo objekt inneholder flere SuggestionsInfo stedene, vanligvis for hvert ord i setningen. Hver SuggestionsInfo objekt inneholder faktiske forslag for et ord i form av String -objekter.

For dette eksempelet, la oss bare sløyfe gjennom alle forslagene og legge dem til en Stringbuffer. Bruk getSuggestionsCount å bestemme antall forslag tilgjengelige og getSuggestionInfoAt å få en henvisning til en bestemt SuggestionInfo

Legg til følgende kode i onGetSentenceSuggestions metode.
Endelige Stringbuffer sb = new Stringbuffer ("" ), for (SentenceSuggestionsInfo resultat: resultater) {int n = result.getSuggestionsCount (); for (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"); }}

Du kan nå bruke TextView sin setText metode for å gjengi innholdet i Stringbuffer. Men du kan ikke kalle metoden direkte, fordi onGetSentenceSuggestions kjører på sin egen tråd. Forsøk på å gjøre endringer i brukergrensesnittet fra et ikke-UI tråden vil føre til en runtime unntak. Derfor må du ringe setText metoden fra innsiden av runOnUiThread metoden
runOnUiThread (ny kjørbart () {Override public void run () {suggestions.setText (sb.toString ());}});.

Hvis du kjører programmet ditt nå, vil produksjonen se slik ut:.

Som du ser, vår app er for tiden viser forslag for alle ordene i setningen, selv for de med riktig stave

For å bare vise forslag for feilstavede ord, må vi se på flaggene knyttet til hver SuggestionsInfo objekt. En SuggestionsInfo gjenstand for et feilstavet ord har RESULT_ATTR_LOOKS_LIKE_TYPO flagget satt. Derfor må vi legge til kode for å ignorere SuggestionsInfo stedene hvor dette flagget ikke er satt

Legg til følgende kode i onGetSentenceSuggestions metoden før den innerste løkken begynner.
If ((resultat .getSuggestionsInfoAt (i) .getSuggestionsAttributes () & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) = SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) fortsetter;!

Kjør app igjen for å se den endrede utgang

2.. Opprette en egendefinert Spell Checker

Nå som du vet hvordan de skal samhandle med standard stavekontroll, la oss gå videre til å lage en tilpasset stavekontroll

Trinn 1:. Opprette en service

Opprett en ny Java-klassen heter SpellingService. For en klasse for å bli behandlet som en stavekontroll av Android-systemet, må det utvide SpellCheckerService klasse og overstyre createSession metoden

Legg til følgende kode i SpellingService.java.
Public class SpellingService strekker SpellCheckerService {Override offentlig Session createSession () {}}
Trinn 2: Lag en Session

All skikken stavekontroll logikk ligger i sesjonen. Opprett en ny klasse som heter MySpellingSession som strekker Session. Du kan lage den som en underklasse av SpellingService.

Session klassen er en abstrakt klasse. Etter overstyrer alle abstrakte metoder, bør klassen din se slik ut:
klasse MySpellingSession strekker Session {Override public void onCreate () {}Override offentlig SuggestionsInfo onGetSuggestions (TextInfo textInfo, int suggestionsLimit) {}Override offentlige SentenceSuggestionsInfo [] onGetSentenceSuggestionsMultiple (TextInfo [] textInfos, int suggestionsLimit) {}}

For denne opplæringen, la oss lage en veldig enkel stavekontroll som har følgende egenskaper:

Det behandler ordet "Peter" som en skrivefeil.

Den returnerer fem alternative stavemåter for ordet "Peter".

Den koden for å implementere disse funksjonene kan legges til onGetSuggestions metoden, fordi det er ment å håndtere enkelte ord (i form av en TextInfo objekter).

Pakk ordet med GetText metoden, og sjekke om det er lik "Peter". Hvis det er, legger de aktuelle forslag til en rekke String stedene. Hvis det ikke er det, holde matrisen tom.

Til slutt, opprette og returnere en ny SuggestionsInfo objektet som inneholder rekke forslag sammen med flagget RESULT_ATTR_LOOKS_LIKE_TYPO. Selve koden kan se slik ut:
String ord = textInfo.getText (); String forslag [] = null; if (word.equals ("Peter")) {forslag = new String [] {"Pedro", "Pietro", "Petar", "Pierre", "Petrus"};} else {forslag = new String [] {};} SuggestionsInfo suggestionsInfo = new SuggestionsInfo (SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO, forslag), tilbake suggestionsInfo;

er ikke ferdig ennå. Den SpellingsClient klassen vi opprettet tidligere gått hele setninger til stavekontrollen, ikke enkeltord. Det betyr at onGetSuggestions metoden vil aldri bli kalt direkte. Derfor trenger vi å skrive kode som kan splitte setninger i ord og sende dem som argumenter til onGetSuggestions metoden. Denne koden må være lagt til onGetSentenceSuggestionsMultiple metoden

Her er hva du gjør i onGetSentenceSuggestionsMultiple metode.

  • Loop gjennom rekke TextInfo objekter den mottar som input og konvertere hver setning i en rekke ord å bruke split-metoden.

    Konverter hvert ord i en TextInfo objekt og gi det som et argument til onGetSuggestions metoden.

    Legg til forslagene returnert til en Arraylist av SuggestionsInfo gjenstander

    Lag og returnere en ny rekke SentenceSuggestionsInfo gjenstander bruke Arraylist av SuggestionsInfo gjenstander

    Legg til følgende kode i onGetSentenceSuggestionsMultiple metoden..:
    List < SuggestionsInfo > suggestionsInfos = new Arraylist < > (); for (int i = 0; i < textInfos.length; i ++) {TextInfo cur = textInfos [i]; //Konverter setning i en rekke ord String ord [] = cur.getText () split ("\\\\ s +."); for (String ord: ord) {TextInfo tmp = new TextInfo (word); //Generer forslag for hvert ord suggestionsInfos.add (onGetSuggestions (tmp, suggestionsLimit)); }} returnere ny SentenceSuggestionsInfo [] {nytt SentenceSuggestionsInfo (suggestionsInfos.toArray (ny SuggestionsInfo [suggestionsInfos.size ()]), ny int [suggestionsInfos.size ()], new int [suggestionsInfos.size ()])};

    Nå som skikken Session klassen er klar, opprette og returnere en forekomst av det i tjenestens createSession metode:
    returnere nye MySpellingSession ();
    Trinn 3: Opprett metadata for Tjenesten

    Opprett en ny XML-fil som heter spellinginfo.xml i res /xml-mappen. Denne filen brukes av Android-systemet for å bestemme navnet på stavekontroll og språkene som støttes. La oss kalle vår stavekontroll Min Spell Checker. Legg til følgende kode i filen:?
    ≪ xml version = "1.0" encoding = "utf-8" > < stavekontroll xmlns:? Android = "http://schemas.android.com/apk /res /android "android: label =" @ streng /SERVICE_LABEL "> < subtype android: label = "engelsk" android: subtypeLocale = "no" /> < /stavekontroll >

    Oppdater verdier /strings.xml slik at den har SERVICE_LABEL:
    < string name = "SERVICE_LABEL" > Min Spell Checker < /string >
    Trinn 4: Oppdatere Manifest

    noen tjeneste som ønsker å oppføre seg som en stavekontroll må be android.permission.BIND_TEXT_SERVICE tillatelse og reagerer på android.service.textservice.SpellCheckerService handlingen. Den bør også inneholde en referanse til metadata XML vi definert i forrige trinn. Definere SpellingService ved å legge til følgende kode i ditt AndroidManifest.xml:
    < tjenesten android: ". SpellingService" name = android: tillatelse = "android.permission.BIND_TEXT_SERVICE" > < intent-filter > < handling android: name = "android.service.textservice.SpellCheckerService" /> < /intent-filter > < meta-data android: name = "android.view.textservice.scs" android: ressurs = "@ xml /spellinginfo" /> < /tjenesten >
    Trinn 5: Aktiver New Spell Checker

    Hvis du kompilere og kjøre programmet ditt nå, vil du se noen forskjell i produksjonen av din aktivitet. Dette er fordi det fortsatt bruker standard Android stavekontroll. For å aktivere din egendefinerte stavekontroll, gå til Innstillinger-appen og velg din stavekontroll i Språk og inndata delen.

    Når aktivert, hvis du starter programmet, vil du se forslag bare for ordet "Peter" .

    Konklusjon

    I denne opplæringen, lært deg hvordan du kan kommunisere med Android stavekontroll tjenester for å utføre stavekontroll operasjoner i programmet ditt. Du har også lært å lage dine egne stavekontroll. Du kan bruke denne kunnskapen til å lage ikke bare bedre IME, men også fullverdig stavekontroller for språk som for øyeblikket ikke støttes av Android som standard. For å vite mer om TextServices API og stavekontrollen rammeverk, se i Android Developers Reference. Anmeldelser