Android IME:如何显示弹出对话框?

时间:2010-08-16 15:10:13

标签: android keyboard 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回到应用程序   正在接收其输入。它是   曾经做过阅读这样的事情   提交文本   文本到文本框,并发送原始   应用程序的关键事件。

到目前为止,我无法弄清楚如何。我知道这是可能的,因为我以前见过它。我有人可以指出我正确的方向,肯定会受到赞赏。


更新

为了更好地了解我尝试实现的目标,我上传了Swype键盘的屏幕截图,其功能正是如下:当键盘上按下特殊键时显示弹出对话框。

Swype pop-up dialog

6 个答案:

答案 0 :(得分: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();
祝你好运。

答案 1 :(得分:3)

IME不在应用程序上下文中运行,因此您无法使用普通的应用程序窗口。您可以使用对话框,但您需要修改其窗口,以便窗口类型为此类型:

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

并将WindowManager.LayoutParams.token设置为IME窗口的标记(通过View.getWindowToken())。

请注意,对话框将无法显示弹出窗口,因为在这种情况下,它本身就是一个弹出窗口。除非您使用窗口标志来更改坐标空间,否则坐标空间将相对于您的IME。

答案 2 :(得分:2)

制作一项活动,并在清单文件中为该活动提供属性

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

答案 3 :(得分: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>

全部,享受

答案 4 :(得分:0)

您必须获得对活动上下文的引用。 无论如何,你应该使用Activity的showDialog方法。

答案 5 :(得分:0)

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