2010-08-16 7 views
5

Je suis jouer avec un certain développement du clavier et essayer de montrer une boîte de dialogue pop-up quand une certaine touche est presséeAndroid IME: comment afficher une boîte de dialogue contextuelle?

if (primaryCode == -301) { 
      AlertDialog mDialog = new AlertDialog.Builder(CONTEXT) 
      .setTitle("My dialog") 
      .setMessage("Lets do it.") 
      .setPositiveButton("ok", null).create(); 
      mDialog.show(); 
} 

Cependant, le problème est la partie CONTEXT. Dans une application normale, ce serait simplement this. J'ai également essayé getApplicationContext() et getBaseContext(), mais aucune de ces œuvres -> clavier se bloque.

android.view.WindowManager $ BadTokenException: Impossible de fenêtre ajouter - null jeton est pas pour une application

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

l'interface InputConnection est le canal de communication à partir d'un InputMethod à l'application qui est recei ving son entrée. Il est utilisé pour effectuer des opérations telles que la lecture du texte autour du curseur, en validant le texte dans la zone de texte et en envoyant des événements clés à l'application.

Jusqu'à présent, je n'ai pas réussi à comprendre comment. Je sais que c'est possible, puisque je l'ai déjà vu. Quelqu'un pourrait me diriger dans la bonne direction qui serait certainement appréciée.


Mise à jour:

Pour donner une meilleure idée de ce que j'essaie de réaliser que j'uploadé une capture d'écran du clavier Swype, qui fait exactement cela: montrant une boîte de dialogue pop-up quand une touche spéciale est pressé sur le clavier.

Swype pop-up dialog

+0

S'il vous plaît aidez-moi comment configurer votre propre clavier? .J'ai fait en utilisant l'application séparée. Je veux montrer le petit clavier près du TextBox (gauche ou droite). C'est ma question. stackoverflow.com/questions/7357876/... J'ai fait mon propre clavier en utilisant la démo API Android .. – Piraba

Répondre

4

la paix soit sur ceux qui suivent la direction,

solution

:

AlertDialog dialog; 
//add this to your code 
     dialog = builder.create(); 
     Window window = dialog.getWindow(); 
     WindowManager.LayoutParams lp = window.getAttributes(); 
      lp.token = mInputView.getWindowToken(); 
      lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 
      window.setAttributes(lp); 
      window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
//end addons 
alert.show(); 

bonne chance.

+0

Et aussi avec vous, lol. – JPM

+0

S'il vous plaît aidez-moi comment configurer votre propre clavier? .J'ai fait en utilisant l'application séparée. Je veux montrer le petit clavier près du TextBox (gauche ou droite). C'est ma question. stackoverflow.com/questions/7357876/... J'ai fait mon propre clavier en utilisant la démo de l'API Android. – Piraba

0

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

+0

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

+0

Une chose est sûre, vous ne pouvez pas afficher de dialogue à partir de ApplicationContext. Pourquoi ne prenez-vous pas une référence de contexte dans votre constructeur de la vue? – fedj

+0

Parce que c'est le service de clavier qui parle à tout champ de saisie de texte d'autres applications (pas mes): http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html – znq

3

Un IME ne s'exécute pas dans un contexte d'application, vous ne pouvez donc pas utiliser les fenêtres d'application normales. Vous pouvez utiliser une boîte de dialogue, mais vous devrez modifier sa fenêtre de telle sorte que le type de fenêtre est ce type:

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_APPLICATION_PANEL

Et mis WindowManager.LayoutParams.token être le signe de la fenêtre IME (via View .getWindowToken()).

Notez que la boîte de dialogue ne sera pas en mesure d'afficher les fenêtres contextuelles, car dans ce cas, elle est elle-même une fenêtre pop-up. L'espace de coordonnées sera également relatif à votre IME sauf si vous utilisez les indicateurs de fenêtre pour le modifier.

+0

Merci de me pointer dans la bonne direction . En outre, en regardant le code source du clavier Android par défaut a répondu à toutes mes questions. – znq

2

Faire une activité et dans le fichier manifeste que l'activité donne l'attribut

android:theme="@android:style/Theme.Dialog" 
1

son très simple, il suffit de créer une activité comme ici (avec toute vue), écrire un code de dialogue dans ce

public class dialog extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Are you sure you want to Delete All Contacts?"); 
    builder.setCancelable(false); 

    builder.setPositiveButton("Yes", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          //deleteAllContacts(); 
         }// 
        }); 

      builder.setNegativeButton("No", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 

    AlertDialog alert = builder.create(); 
    alert.show(); 

} 
} 

aller maintenant dans le fichier manifeste Android et ajouter une activité comme,

<activity android:name=".dialog" android:theme="@android:style/Theme.NoDisplay">  </activity> 

son tout, profiter

Questions connexes