3 votes

Comment appeler une activité depuis InputMethodService et obtenir une réponse

J'ai un clavier tactile en tant que service de méthode de saisie appelant une activité. Un bouton est pressé et un scanner est activé. L'activité de numérisation capture un ensemble de données puis renvoie les données au service de méthode de saisie pour remplir un champ de texte sur un navigateur.

Comment puis-je renvoyer la valeur numérisée de l'activité au service de méthode de saisie ?

Merci pour toute aide.

2voto

hackbod Points 55292

Vous ne pouvez généralement pas le faire à partir d'un Service. Parce qu'un Service n'est pas une Activity, il ne peut pas recevoir de résultats d'une Activity, et donc n'a pas de startActivityForResult().

En fait, vous ne voulez probablement pas le faire. Démarrer une activité sera au mieux une expérience maladroite - un utilisateur saisissant des données dans un champ ne veut pas vraiment basculer vers l'activité d'une autre application dans le cadre de son entrée.

Pire, cela ouvre la porte à de nombreuses interactions désagréables. Par exemple, s'ils appuient sur Accueil ou utilisent une notification ou des applications récentes pour passer à une autre application, que se passera-t-il avec votre activité? Probablement rien de bon.

Je recommanderais plutôt de simplement afficher une boîte de dialogue dans l'IME - utilisez la classe Dialog et définissez son type de fenêtre sur TYPE_INPUT_METHOD_DIALOG. Cela s'affichera par dessus votre IME, vous permettant d'interagir avec l'utilisateur sans interrompre la session d'édition. Par exemple, vous voudrez définir cette boîte de dialogue pour ne pas prendre le focus avec FLAG_NOT_FOCUSABLE afin de ne pas perturber la session de saisie de texte où l'utilisateur effectue une saisie.

Et honnêtement, le meilleur moyen de procéder est d'incorporer votre interface utilisateur dans l'IME lui-même.

1voto

Lucas Points 420

Voici un code pour tester la solution en utilisant Dialog :

// 1. CRÉER LE DIALOGUE
val builder: AlertDialog.Builder = AlertDialog.Builder(this, R.style.Theme_AppCompat_Light)
builder.setTitle("Titre").setMessage("Ceci est le message pour l'utilisateur. ")
val mDialog = builder.create()

// 2. DÉFINIR L'ATTRIBUT DU JETON DE LA FENÊTRE IME AVEC LE JETON DE LA VUE DU CLAVIER 
mDialog.window?.attributes?.token = this.mKeyboardView.windowToken

// 3. DÉFINIR LE TYPE DU DIALOGUE SUR TYPE_APPLICATION_ATTACHED_DIALOG
mDialog.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)

// 4. AFFICHER LE DIALOGUE
mDialog.show()

-1voto

Avram Score Points 966

Ce que vous voulez, c'est startActivityForResult(votreIntent, SCAN_VALUE). Votre IME lancera l'activité, qui renverra ensuite une valeur à l'IME.

Donc, votre service fera quelque chose comme suit:

Intent votreIntent = new Intent(this , VotreActivité.class);
this.startActivityForResult(votreIntent, SCAN_VALUE);

Aussi dans votre Service, vous devrez appeler onActivityResult():

protected void onActivityResult(int requestCode, int resultCode, Intent data)
  {
  switch(requestCode) {
  case SCAN_VALUE:
        if (resultCode == RESULT_OK) {

//TODO: Créez ici une fonctionnalité!

            break;
        }

D'accord, maintenant attaquons votre activité lancée. Vous devrez la modifier pour qu'elle corresponde à vos besoins, mais voici comment vous pourriez renvoyer une valeur, disons, depuis un ListAdapter. Vous n'avez pas posté votre code, donc il est difficile de savoir exactement ce que vous faites.

  Object o = this.getListAdapter().getItem(position);
  String valeurScan = o.toString();
  Intent returnIntent = new Intent();
  returnIntent.putExtra("ValeurScan", valeurScan);
  setResult(RESULT_OK,returnIntent);       
  finish();

Cela renverra une valeur à l'IME qui a lancé l'activité sous forme de chaîne de caractères. Encore une fois, si vous postez votre code, je pourrai vous donner des instructions plus précises. J'espère que cela vous aidera à comprendre startActivityForResult() en attendant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X