2010-08-16 1 views
5

Sto giocando intorno con un certo sviluppo tastiera e cercare di mostrare una finestra pop-up quando si preme un determinato tastoIME per Android: come visualizzare una finestra di dialogo popup?

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

Tuttavia, il problema è la parte CONTEXT. In un'applicazione normale sarebbe solo this. Ho anche provato getApplicationContext() e getBaseContext(), ma nessuno di questi funziona -> crash della tastiera.

android.view.WindowManager $ BadTokenException: Impossibile aggiungere finestra - nulla di token è non per un'applicazione

quindi mi chiedo se devo fare qualcosa con InputConnection:

l'interfaccia InputConnection è il canale di comunicazione da una InputMethod indietro all'applicazione che è recei il suo input. È utilizzato per eseguire operazioni come la lettura del testo attorno al cursore, il commit del testo nella casella di testo e l'invio di eventi chiave originali all'applicazione.

Finora non sono stato in grado di capire come. Sicuramente so che è possibile, visto che l'ho visto prima. Qualcuno potrebbe indicarmi la giusta direzione che sarebbe sicuramente apprezzata.


Aggiornamento:

Per fornire un quadro più preciso di quello che cerco di ottenere ho caricato uno screenshot della tastiera Swype, che fa esattamente questo: che mostra una finestra pop-up quando un tasto speciale viene premuto sulla tastiera.

Swype pop-up dialog

+0

Per favore aiutami come impostare la tua tastiera? . Ho fatto utilizzando un'applicazione separata. Voglio mostrare una piccola tastiera vicino al TextBox (sinistra o destra). Questa è la mia domanda. stackoverflow.com/questions/7357876/... Ho fatto la mia tastiera utilizzando la demo dell'API Android .. – Piraba

risposta

4

pace sia su coloro che seguono la guida,

soluzione:

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(); 

buona fortuna.

+0

E anche con te, lol. – JPM

+0

Ti prego, aiutami come impostare la tua tastiera? . Ho fatto utilizzando un'applicazione separata. Voglio mostrare una piccola tastiera vicino al TextBox (sinistra o destra). Questa è la mia domanda. stackoverflow.com/questions/7357876/... Ho fatto la mia tastiera utilizzando la demo dell'API Android .. – Piraba

0

Dovete ottenere un riferimento al contesto di attività. Ad ogni modo, dovresti usare il metodo showDialog dell'attività.

+0

Due problemi: 1) Sto sviluppando un IME (tastiera), quindi non è la mia attività 2) Come ottengo il riferimento alla corrente attività? (Questa è in realtà la mia domanda sopra) – znq

+0

Una cosa è certa, non è possibile visualizzare alcuna finestra di dialogo da ApplicationContext. Perché non prendi un riferimento di contesto nel tuo costruttore della vista? – fedj

+0

Perché è il servizio di tastiera che parla con qualsiasi campo di inserimento di testo di altre (non mie) applicazioni: http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html – znq

3

Un IME non viene eseguito in un contesto di applicazione, quindi non è possibile utilizzare le normali finestre dell'applicazione. È possibile utilizzare una finestra di dialogo, ma sarà necessario modificare la sua finestra in modo che il tipo di finestra è questo tipo:

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

E impostare WindowManager.LayoutParams.token ad essere il segno della finestra IME (via View .getWindowToken()).

Si noti che la finestra di dialogo non sarà in grado di visualizzare finestre popup, perché in questo caso è di per sé una finestra pop-up. Anche lo spazio delle coordinate sarà relativo al tuo IME a meno che tu non usi i flag delle finestre per cambiarlo.

+0

Grazie per avermi indicato nella giusta direzione . Inoltre, guardando il codice sorgente della tastiera di default di Android ha risposto a tutte le mie domande. – znq

2

Fai di attività e nel file manifesto danno che l'attività l'attributo

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

è molto semplice, basta creare attività come qui (con qualsiasi vista), scrivere il codice di dialogo in esso

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(); 

} 
} 

ora passare al file manifest Android e aggiungere un'attività come,

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

è tutto, goditi