2010-08-16 40 views
5

我玩弄一些鍵盤的開發,並嘗試以顯示彈出對話框當某個鍵被按下Android IME:如何顯示彈出對話框?

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

然而,問題是CONTEXT一部分。在正常的應用程序中,它只是this。我也試過getApplicationContext()getBaseContext(),但這些都沒有工作 - >鍵盤崩潰。

android.view.WindowManager $ BadTokenException: 無法添加窗口 - 令牌null是 不是一個應用程序

所以我想知道如果我不得不做一些與InputConnection

的InputConnection接口是從 INPUTMETHOD的 通信信道返回到應用程序 即recei對其輸入進行調查。它是 用於執行諸如讀取光標周圍的文本 文本,將 文本提交到文本框以及將原始 關鍵事件發送到應用程序等。

到目前爲止,我無法弄清楚如何。我肯定知道這是可能的,因爲我以前見過它。我有人可以指出我肯定會讚賞的正確方向。


更新:

提供什麼,我儘量做到我上傳的Swype鍵盤的截圖,這不正是一個更好的畫面:顯示一個彈出式對話框時,特殊鍵被按下在鍵盤上。

Swype pop-up dialog

+0

請幫助我如何設置自己的鍵盤? 。我已經完成了使用單獨的應用程序。我想在文本框附近顯示小鍵盤(左或右)。這是我的問題。 stackoverflow.com/questions/7357876/...我已經做了我自己的鍵盤使用Android API演示.. – Piraba 2011-11-02 07:30:42

回答

4

願和平降臨那些誰遵循的指導下,

解決方案:

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

好運。

+0

還有你,大聲笑。 – JPM 2011-09-15 18:13:32

+0

請幫助我如何設置您自己的鍵盤? 。我已經完成了使用單獨的應用程序。我想在文本框附近顯示小鍵盤(左或右)。這是我的問題。 stackoverflow.com/questions/7357876/...我使用Android API演示完成了自己的鍵盤。 – Piraba 2011-11-02 07:29:59

0

你必須讓你的活動範圍內的參考。 無論如何,你應該使用Activity的showDialog方法。

+0

兩個問題:1)我正在開發IME(鍵盤),因此它不是我的活動2)如何獲得參考到當前的活動? (這實際上是我上面的問題) – znq 2010-08-16 16:12:52

+0

有一件事是肯定的,你不能從ApplicationContext顯示任何對話框。爲什麼你不在視圖的構造函數中使用上下文引用? – fedj 2010-08-16 16:32:34

+0

因爲它是與其他(不是我的)應用程序的任何文本輸入字段對話的鍵盤服務:http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html – znq 2010-08-16 20:31:44

3

IME不會在應用程序上下文中運行,因此您無法使用正常的應用程序窗口。您可以使用一個對話框,但你需要修改它的窗口,使窗口類型是這樣的類型:

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

並設置WindowManager.LayoutParams.token是IME窗口的令牌(通過查看.getWindowToken())。

請注意,對話框將無法顯示彈出窗口,因爲在這種情況下,它本身就是一個彈出窗口。除非您使用窗口標誌來更改它,否則座標空間將相對於您的IME。

+0

感謝您指引我在正確的方向。另外查看Android的默認鍵盤源代碼回答了我的所有問題。 – znq 2010-08-26 11:42:27

2

做一個活動,並在清單文件給該活動的屬性

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

它非常簡單,只需創建一個像這裏的活動(與任何視圖),寫對話的代碼在它

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

} 
} 

現在去Android清單文件,並添加活性喜歡,

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

其全部,享受