我正在玩一些键盘开发,并在按下某个键时尝试显示弹出对话框
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键盘的屏幕截图,其功能正是如下:当键盘上按下特殊键时显示弹出对话框。
答案 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不在应用程序上下文中运行,因此您无法使用普通的应用程序窗口。您可以使用对话框,但您需要修改其窗口,以便窗口类型为此类型:
并将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()