6
votes

Android IME: Comment montrer une boîte de dialogue contextuelle?

Je joue avec un certain développement de clavier et j'essaie d'afficher une boîte de dialogue contextuelle lorsque une certaine touche est appuyée sur xxx

Toutefois, le problème est le "code> contexte partie. Dans une application normale, il serait juste d'être ceci . J'ai aussi essayé gettaplicationContextextextex () et getbasecontext () , mais aucun de ces œuvres -> Crashs de clavier.

Android.View.windowManager $ BadTokenException: Impossible d'ajouter une fenêtre - Token NULL est pas pour une application

Je me demande si je dois faire quelque chose avec InputConnection :

L'interface d'entréeConnection est la canal de communication d'un INPUTMETHOD Retour à l'application qui reçoit son entrée. Il est utilisé pour effectuer des choses telles que la lecture Texte autour du curseur, commettre Texte dans la zone de texte et envoi de RAW Événements clés à l'application.

Jusqu'à présent, je n'ai pas pu comprendre comment. Je sais certainement que c'est possible, car je l'ai déjà vu auparavant. Je peux me signaler dans la bonne direction qui serait définitivement appréciée.


update:

Pour fournir une meilleure image de ce que j'essaie Pour atteindre, j'ai téléchargé une capture d'écran du clavier Swype, qui fait exactement que: Affiche une boîte de dialogue contextuelle lorsqu'une touche spéciale est enfoncée sur le clavier.

 Swype Pop-up


0 commentaires

6 Réponses :


0
votes

Vous devez avoir une référence à votre contexte d'activité. Quoi qu'il en soit, vous devez utiliser la méthode ShowDioriog de l'activité.


4 commentaires

Deux problèmes: 1) Je développe une IMI (clavier), ce n'est donc pas mon activité 2) Comment puis-je obtenir la référence à l'activité actuelle? (C'est en fait ma question ci-dessus)


Une chose est sûre, vous ne pouvez afficher aucune boîte de dialogue de l'applicationContext. Pourquoi ne prenez-vous pas une référence de contexte dans votre constructeur de la vue?


Parce que c'est un service de clavier qui parle à n'importe quel champ de saisie de texte d'autres applications (pas my): développeur.android.com/reference/android/view/inputMethod/.../a>


@ZNQ Pouvez-vous m'aider à ouvrir la boîte de dialogue d'un service IME?



3
votes

Un IME ne fonctionne pas dans un contexte d'application, vous ne pouvez donc pas utiliser Windows d'application normale. Vous pouvez utiliser une boîte de dialogue, mais vous devrez modifier sa fenêtre afin que le type de fenêtre soit ce type:

http://developer.android.com/reference /android/view/windowmanager.layoutparams.html#type_application_panel

et définir la fenêtremanager.layoutParams.TenkSparams.token est le jeton de la fenêtre IME (via View.gewindowokokokokokoken ()).

Notez que la boîte de dialogue ne sera pas en mesure d'afficher des fenêtres contextuelles, car dans ce cas, il est lui-même efficace une fenêtre contextuelle. De plus, l'espace de coordonnées sera relatif à votre IMI, à moins que vous n'utilisiez les drapeaux de la fenêtre pour la modifier.


2 commentaires

Merci de me pointer dans la bonne direction. En outre, en regardant le code source par défaut de l'Android, répondit toutes mes questions.


@hackbod j'ai essayé votre suggestion, mais cela ne fonctionne pas sur Android 9. Pouvez-vous consulter Stackoverflow.com/Questions/51906586/... ?



2
votes

faire une activité et dans le fichier manifeste donne cette activité l'attribut xxx


0 commentaires

5
votes

La paix soit sur ceux qui suivent les directives,

solution: xxx

bonne chance.


3 commentaires

Si le clavier logiciel est ouvert et essayez d'ouvrir la boîte de dialogue d'alerte, l'affichage de la touche programmable dans la zone AlertDialog ne permet pas d'ajouter du texte à l'intérieur de la zone EditText de la zone ALTERTILOG


Tout d'abord, merci! Pour une raison quelconque, parfois après avoir appuyé sur le bouton positif, OnfinishInputView est en cours d'appel. Avez-vous une idée pourquoi?


Cela ne fonctionne plus pour moi. Quelqu'un peut-il m'aider s'il vous plaît à ouvrir la boîte de dialogue depuis un service IME? @Amitklein



0
votes

Son très simple, il suffit de créer une activité comme ici (sans aucune vue), écrivez le code de dialogue de la boîte de dialogue xxx

aller au fichier manifeste Android et ajouter une activité comme, xxx

c'est tout, profitez


0 commentaires

0
votes
// 1. CREATE THE DIALOG
val builder: AlertDialog.Builder = AlertDialog.Builder(this, R.style.Theme_AppCompat_Light)
builder.setTitle("Title").setMessage("This is the message for the user. ")
val mDialog = builder.create()

// 2. SET THE IME WINDOW TOKEN ATTRIBUTE WITH THE TOKEN OF THE KEYBOARD VIEW 
mDialog.window?.attributes?.token = this.mTblView.windowToken

// 3. SET THE TYPE OF THE DIALOG TO TYPE_APPLICATION_ATTACHED_DIALOG
mDialog.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)

// 4. SHOW THE DIALOG 
mDialog.show()

0 commentaires