6

我正在玩一些键盘开发,并尝试在按下某个键时显示一个弹出对话框

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()and getBaseContext(),但这些都不起作用->键盘崩溃。

android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序

所以我想知道我是否必须对InputConnection做些什么:

InputConnection 接口是从 InputMethod 返回到接收其输入的应用程序的通信通道。它用于执行诸如读取光标周围的文本、将文本提交到文本框以及向应用程序发送原始键事件等操作。

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


更新:

为了更好地了解我尝试实现的目标,我上传了 Swype 键盘的屏幕截图,它正是这样做的:当在键盘上按下特殊键时会显示一个弹出对话框。

Swype 弹出对话框

4

6 回答 6

5

愿那些遵循指引的人平安,

解决方案 :

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

祝你好运。

于 2010-11-25T10:02:37.837 回答
3

IME 不在应用程序上下文中运行,因此您不能使用正常的应用程序窗口。您可以使用 Dialog,但您需要修改其窗口,以便窗口类型为以下类型:

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

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

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

于 2010-08-18T02:10:13.800 回答
2

创建一个活动并在清单文件中为该活动提供属性

android:theme="@android:style/Theme.Dialog"
于 2010-08-18T18:27:17.987 回答
0

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

于 2010-08-16T16:06:38.893 回答
0

它非常简单,只需像这里一样创建活动(没有任何视图),在其中编写对话框代码

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>

一切,享受

于 2011-09-15T17:39:15.347 回答
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()
于 2020-03-17T19:17:39.123 回答