我正在制作一个键盘(InputMethodService),需要启动一个对话框。
正如我发现的那样,服务无法启动对话框。所以我做了一个单独的活动,通过
从服务中调用 Intent dialogIntent = new Intent(getBaseContext(), dialog.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);
并显示一个对话框。问题是这个活动取代了之前用户输入内容的活动。
您认为什么是使其“透明”(即不要推开以前的活动)的最佳方式,以及此活动与服务对话的最佳方式是什么,说对话选项被选中了。
谢谢! :)
答案 0 :(得分:2)
如果这是Activity
(不是Dialog
),您可以在activity
的{{1}}部分添加对话框主题:
AndroidManifest
至于取回用户按下的内容,您应该使用startActivityForResult(...)
答案 1 :(得分:2)
您不应该从IME启动活动。这是IME流程中的一个巨大突破 - 活动出现并从当前应用程序切换应用程序,从中获取焦点,并断开与当前编辑器的连接。
此外,无法从中获取结果,因为您只能使用活动中的startActivityForResult()。
要在IME中显示对话框,只需在显示对话框之前使用Dialog.getWindow()。setType(WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG。
答案 2 :(得分: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.mKeyboardView.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()