【发布时间】:2019-01-25 03:46:36
【问题描述】:
我的应用程序包含一个输入法服务,该服务带有一个特殊按钮,可以弹出一个对话框。对于 Android 9 的用户,此对话框无法正确显示,只有 IME 上方的部分可见:
创建对话框的代码是
AlertDialog dialog = builder.create();
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
lp.token = inputView.getWindowToken();
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.show();
与https://stackoverflow.com/a/13962770/292233中描述的相同
我也按照https://stackoverflow.com/a/3508462/292233 中的建议尝试了TYPE_APPLICATION_PANEL,但这也无济于事。
有什么简单的解决办法吗?
【问题讨论】:
-
开始一个以对话为主题的活动。
-
@commonsware 我正在考虑这个,但是您将如何将数据返回到 IME 服务?我无法从我的服务中使用 startActivityForResult。
-
如果活动和服务在同一个进程中,你可以使用任何你想要的。这可能是一个事件总线(例如,
LocalBroadcastManager)。这可以通过与单例存储库进行交互来实现。等等。如果活动和服务在不同的进程中,则使用PendingIntent,或Messenger,或ResultReceiver等。 -
@CommonsWare 我已将活动实现为对话框(使用主题=),这在大多数情况下都有效,但用户指出,在 Chrome 上,当对话框弹出时,IME 已关闭,看起来就像我再也无法将文本输入到输入字段一样。我正在使用 getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);在活动的 onCreate 中。有什么想法吗?谢谢。
-
“用户指出,在 Chrome 上,当对话框弹出时,IME 会关闭”——你无法控制它。是否显示 IME 取决于具有触发 IME 的
EditText(或其他)的应用程序。在这种情况下,Chrome 可能会在 Chrome 不再具有输入焦点时使用InputMethodManager隐藏 IME。