Si vous créez un IME (éditeur de méthode de saisie) ou une application de traitement du langage personnalisé, vous pouvez utiliser le framework de vérificateur orthographique d'Android pour ajouter rapidement une fonctionnalité de vérification orthographique à votre application sans avoir à vous occuper de tâches de bas niveau, telles que la gestion de listes de mots ou de mots clés. déterminer les distances de Damerau-Levenshtein entre les mots.
Le framework peut également être utilisé pour créer un correcteur orthographique personnalisé (par exemple pour une nouvelle langue ou pour un domaine spécifique) que d'autres applications peuvent utiliser..
Ce tutoriel vous montre d'abord comment utiliser le framework pour interagir avec le correcteur orthographique par défaut d'Android, puis couvre les bases du développement d'un correcteur orthographique personnalisé..
Activité
Avant de plonger dans le cadre, commençons par créer un Activité
qui peut afficher les résultats des vérifications orthographiques.
Créez une nouvelle classe Java appelée OrthographeClient qui s'étend Activité
. Cette classe doit également implémenter le SpellCheckerSession.SpellCheckerSessionListener
interface pour interagir avec les services de vérification orthographique d'Android. Dans Android Studio, vous pouvez appuyer sur Alt + Insert générer automatiquement des stubs vides pour les méthodes de l'interface.
Comme cela Activité
va avoir qu'un seul Affichage
dans sa mise en page, vous n'avez pas besoin de créer un XML de mise en page pour cela. Remplacer le onCreate
méthode pour initialiser le Affichage
et le passer à la setContentView
méthode pour qu'elle occupe tout l'écran.
À ce stade, votre classe devrait ressembler à ceci:
Classe publique SpellingsClient extend L'activité implémente SpellCheckerSession.SpellCheckerSessionListener suggestions de TextView privées; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); suggestions = new TextView (this); setContentView (suggestions); @Override public nul onGetSuggestions (SuggestionsInfo [] résultats) @Override public nul onGetSentenceSuggestions (SentenceSuggestionsInfo [] résultats)
Passons maintenant une phrase contenant plusieurs mots mal orthographiés au correcteur orthographique par défaut d’Android. Créez une méthode nommée fetchSuggestionsFor qui accepte un Chaîne
en paramètre.
void privé fetchSuggestionsFor (Entrée de chaîne)
Parce que le correcteur orthographique Un service
fait partie du Services de texte API, vous devez utiliser le getSystemService
méthode pour récupérer une instance de TextServicesManager
. Vous pouvez alors appeler le nouveauSpellCheckerSession
méthode pour créer un nouveau session
, qui peut être utilisé pour envoyer des données au correcteur orthographique. Ajoutez le code suivant à la méthode:
TextServicesManager tsm = (TextServicesManager) getSystemService (TEXT_SERVICES_MANAGER_SERVICE); SpellCheckerSession session = tsm.newSpellCheckerSession (null, Locale.ENGLISH, this, true);
Assurez-vous que le Lieu
vous passez à nouveauSpellCheckerSession
correspond à la langue de votre phrase d'entrée.
Maintenant que le session
est prêt, vous pouvez appeler getSentenceSuggestions
obtenir des suggestions orthographiques pour une ou plusieurs phrases.
le getSentenceSuggestions
méthode prend deux paramètres. Le premier paramètre est un tableau de TextInfo
objets. Vous utilisez le constructeur de la TextInfo
classe pour convertir un Chaîne
dans une TextInfo
objet. Le deuxième paramètre est un int
qui spécifie le nombre de suggestions à générer. Pour cet exemple, définissons-le sur 5.
Ajoutez le code suivant à la méthode:
session.getSentenceSuggestions (new TextInfo [] new TextInfo (entrée), 5);
Enfin, appelez fetchSuggestionsFor
dans le onCreate
méthode du Activité
.
// Passage d'une phrase comportant deux // mots mal orthographiés fetchSuggestionsFor ("Peter livs in Brlin");
Notez que le getSentenceSuggestions
méthode a été introduite dans le niveau API 16. Les versions précédentes de l'API utilisaient le, désormais obsolète, getSuggestions
méthode.
le getSentenceSuggestions
La méthode interagit avec le correcteur orthographique de manière asynchrone. Lorsque les suggestions ont été générées, le onGetSentenceSuggestions
la méthode s'appelle.
Les suggestions pour chaque phrase d'entrée sont disponibles dans un fichier séparé. SentenceSuggestionsInfo
objet. Chaque SentenceSuggestionsInfo
objet contient plusieurs SuggestionsInfo
objets, généralement pour chaque mot de la phrase. Chaque SuggestionsInfo
objet contient les suggestions réelles pour un mot sous la forme de Chaîne
objets.
Pour cet exemple, parcourons simplement toutes les suggestions et les annexons à une StringBuffer
. Utilisation getSuggestionsCount
déterminer le nombre de suggestions disponibles et getSuggestionInfoAt
pour obtenir une référence à un particulier SuggestionInfo
.
Ajoutez le code suivant au onGetSentenceSuggestions
méthode:
final StringBuffer sb = new StringBuffer (""); for (résultat PhraseSuggestionsInfo: résultats) int n = result.getSuggestionsCount (); pour (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");
Vous pouvez maintenant utiliser le Affichage
de Définir le texte
méthode pour rendre le contenu de la StringBuffer
. Cependant, vous ne pouvez pas appeler la méthode directement, car onGetSentenceSuggestions
fonctionne sur son propre thread. Toute tentative de modification de l'interface utilisateur à partir d'un thread non-UI entraînera une exception d'exécution. Par conséquent, assurez-vous d'appeler le Définir le texte
méthode de l'intérieur du runOnUiThread
méthode.
runOnUiThread (new Runnable () @Override public void run () suggestions.setText (sb.toString ()););
Si vous exécutez votre application maintenant, la sortie ressemblera à ceci:
Comme vous pouvez le constater, notre application affiche actuellement des suggestions pour tous les mots de la phrase, même ceux orthographiés correctement..
Pour afficher uniquement les suggestions de mots mal orthographiés, nous devrons examiner les drapeaux associés à chaque mot. SuggestionsInfo
objet. UNE SuggestionsInfo
objet pour un mot mal orthographié a le RESULT_ATTR_LOOKS_LIKE_TYPO
ensemble de drapeaux. Par conséquent, nous devons ajouter du code pour ignorer SuggestionsInfo
objets où cet indicateur n'est pas défini.
Ajoutez le code suivant au onGetSentenceSuggestions
méthode avant le début de la boucle la plus interne:
if ((result.getSuggestionsInfoAt (i) .getSuggestionsAttributes () & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO)! = SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) continue;
Exécutez l'application à nouveau pour voir la sortie modifiée.
Maintenant que vous savez comment interagir avec le correcteur orthographique par défaut, passons à la création d'un correcteur orthographique personnalisé..
Un service
Créez une nouvelle classe Java nommée SpellingService. Pour qu'une classe soit traitée comme un correcteur orthographique par le système Android, elle doit étendre la SpellCheckerService
classe et outrepasser la createSession
méthode.
Ajoutez le code suivant à SpellingService.java:
Classe publique SpellingService étend SpellCheckerService @Override public Session createSession ()
Toute la logique de vérification orthographique personnalisée réside dans le Session
. Créer une nouvelle classe nommée MySpellingSession qui s'étend Session
. Vous pouvez le créer en tant que sous-classe de SpellingService
.
le Session
classe est une classe abstraite. Après avoir remplacé toutes les méthodes abstraites, votre classe devrait ressembler à ceci:
class MySpellingSession étend la session @Override public void onCreate () @Override public SuggestionsInfo surGetSuggestions (TextInfo textInfo, int suggestionsLimit) @Override public SentenceSuggestionsInfo [] surGetSentenceSuggestions (TextInfo)
Pour ce tutoriel, créons un correcteur orthographique très simple doté des fonctionnalités suivantes:
Le code pour implémenter ces fonctionnalités peut être ajouté à la onGetSuggestions
méthode, car il est supposé gérer des mots individuels (sous forme de TextInfo
objets).
Extraire le mot en utilisant le getText
méthode et vérifiez si elle est égale à "Peter". Si tel est le cas, ajoutez les suggestions appropriées à un tableau de Chaîne
objets. Si ce n'est pas le cas, laissez le tableau vide.
Enfin, créez et retournez un nouveau SuggestionsInfo
objet qui contient le tableau de suggestions avec le drapeau RESULT_ATTR_LOOKS_LIKE_TYPO
. Le code actuel pourrait ressembler à ceci:
Mot de chaîne = textInfo.getText (); Suggestions de chaînes [] = null; if (word.equals ("Peter")) suggestions = new String [] "Pedro", "Pietro", "Petar", "Pierre", "Petrus"; else suggestions = new String [] ; SuggestionsInfo suggestionsInfo = new SuggestionsInfo (SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO, suggestions); renvoyer suggestionsInfo;
Nous n'avons pas encore fini. le OrthographeClient
La classe que nous avons créée précédemment a transmis des phrases entières au correcteur orthographique, et non des mots individuels. Cela signifie que le onGetSuggestions
La méthode ne sera jamais appelée directement. Par conséquent, nous devons écrire un code capable de scinder les phrases en mots et de les transmettre comme arguments au onGetSuggestions
méthode. Ce code doit être ajouté à la onGetSentenceSuggestionsMultiple
méthode.
Voici ce que vous faites dans le onGetSentenceSuggestionsMultiple
méthode:
TextInfo
objets qu'il reçoit en entrée et convertit chaque phrase en un tableau de mots à l'aide du Divisé
méthode.TextInfo
objet et le passer comme un argument à la onGetSuggestions
méthode.ArrayList
de SuggestionsInfo
objets.SentenceSuggestionsInfo
objets utilisant le ArrayList
de SuggestionsInfo
objets.Ajoutez le code suivant au onGetSentenceSuggestionsMultiple
méthode:
listesuggestionsInfos = new ArrayList <> (); pour (int i = 0; i Maintenant que la coutume
Session
la classe est prête, créez et retournez une instance de celle-ci dans le servicecreateSession
méthode:renvoyer new MySpellingSession ();Étape 3: Créer les métadonnées pour le service
Créez un nouveau fichier XML appelé spellinginfo.xml dans le res / xml dossier. Ce fichier est utilisé par le système Android pour déterminer le nom du vérificateur orthographique et les langues qu’il prend en charge. Appelons notre correcteur orthographique Mon correcteur orthographique. Ajoutez le code suivant au fichier:
Mettez à jour votre values / strings.xml de sorte qu'il a
label_service
:Mon correcteur orthographique Étape 4: Mettre à jour le manifeste
Tout
Un service
qui veut se comporter comme un correcteur orthographique doit demander leandroid.permission.BIND_TEXT_SERVICE
permission et répondre à laandroid.service.textservice.SpellCheckerService
action. Il devrait également contenir une référence au XML de métadonnées que nous avons défini à l'étape précédente. DéfinirSpellingService
en ajoutant le code suivant à votre AndroidManifest.xml:Étape 5: Activer le nouveau vérificateur orthographique
Si vous compilez et exécutez votre application maintenant, vous ne verrez aucune différence dans la sortie de votre
Activité
. En effet, il utilise toujours le correcteur orthographique Android par défaut. Pour activer votre correcteur orthographique personnalisé, accédez à la Réglages app et choisissez votre correcteur orthographique dans le Langue et entrée section.Une fois activé, si vous redémarrez l'application, vous verrez des suggestions uniquement pour le mot "Peter"..
Conclusion
Dans ce tutoriel, vous avez appris à communiquer avec les services de vérification orthographique d'Android pour effectuer des opérations de vérification orthographique dans votre application. Vous avez également appris à créer votre propre correcteur orthographique personnalisé. Vous pouvez utiliser ces connaissances pour créer non seulement de meilleurs IME, mais également des correcteurs orthographiques complets pour les langues actuellement non prises en charge par Android. Pour en savoir plus sur l'API TextServices et la structure du vérificateur d'orthographe, consultez le manuel de référence des développeurs Android..