Android IME:显示一个自定义弹出对话框(如 Swype 键盘),可以在 TextView 中输入文本

Posted

技术标签:

【中文标题】Android IME:显示一个自定义弹出对话框(如 Swype 键盘),可以在 TextView 中输入文本【英文标题】:Android IME: showing a custom pop-up dialog (like Swype keyboard) which can enter text into the TextView 【发布时间】:2011-03-31 16:10:07 【问题描述】:

我想知道如何创建一个自定义弹出窗口,如下面的屏幕截图中的那个(借自 Swype 键盘),其中我可以有几个按钮,每个按钮都将一个字符串提交给当前“已连接” “TextView(通过InputConnection)。

请注意:这是InputMethodService,而不是普通的Activity。我已经尝试使用Theme:Dialog 启动单独的Activity。但是,一旦打开,我就失去了对TextView 的关注,并且我的键盘消失了(我的InputConnection 也随之消失了)。

【问题讨论】:

【参考方案1】:

您可以尝试使用PopupWindow。你必须做一些黑客攻击才能让它做你想做的事情,唯一好的文档就是源代码。

【讨论】:

酷。感谢您的提示。我已经在浏览 android 的键盘源代码了,所以我已经习惯了 :-) @znq,你真的做到了吗?你最终是使用PopupWindow 还是别的什么?能否指点一下? 在您的 KeyboardView 子类中创建 PopupWindow 至关重要,而不是在 InputMethodService 或其他任何地方。如果您希望它显示在键盘上方,请使用负 Y 位置。 我想通了;您只需要在使用弹出窗口之前调用 PopupWindow.setClippingEnabled(false),否则您的负 Y 坐标将不起作用。添加为下面的答案。【参考方案2】:

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

解决方案:

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

dialog.show();

===== 更新 30.09.2015 mInputView 它是你的键盘类的通用名称..see

@Override
    public View onCreateInputView() 
        mInputView =(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
....

更多信息:http://developer.android.com/guide/topics/text/creating-input-method.html

祝你好运。

【讨论】:

【参考方案3】:

我也在努力解决这个问题,我终于弄明白了。上述解决方案是正确的,尽管正如您指出的那样,它们不能从 InputMethodService 中使用,因为它不是 Activity。诀窍是在 KeyboardView 的子类中创建 PopupWindow。通过使用负 Y 位置,PopupWindow 可以像 Swype 一样出现在键盘上方。

祝你好运, 巴里

【讨论】:

【参考方案4】:

正确答案:

    创建一个PopupWindow 并将您的视图放入其中 致电popupWindow.setClippingEnabled(false) 使用负 Y 坐标调用 [popupWindow.showAtLocation()](http://developer.android.com/reference/android/widget/PopupWindow.html#showAtLocation(android.view.View, int, int, int))。

这将在 IME 上方显示您的弹出窗口,如您的屏幕截图所示。

【讨论】:

在 Android P 中不工作,即使 Y 坐标为负。除非,我们将窗口布局类型设置为 TYPE_APPLICATION_OVERLAY,这需要 SYSTEM_ALERT 权限。 @elsennov 我有一个应用程序正在执行此操作。我的手机在 Android P 上,这对我有用:github.com/walles/exactype/blob/… 对不起,之前没有提到。我的意思是,不是所有的 android P。我在我的设备三星 S9 上测试过,它可以工作。但是当我在模拟器(谷歌像素,android P)上测试它时它不起作用@JohanWalles 我只在S9上测试过,没有在模拟器上测试过。如果它在那里不起作用,那么我不知道,对不起。

以上是关于Android IME:显示一个自定义弹出对话框(如 Swype 键盘),可以在 TextView 中输入文本的主要内容,如果未能解决你的问题,请参考以下文章

优化自定义Dialog的弹出速度

android:自定义可输入对话框,EditText已经获得焦点,为啥就是不弹出输入法呢?

android将activity设置成自定义的Dialog怎么调整大小

如何将自定义对话框定位在特定坐标?

请教实现android工程中点击菜单弹出一个对话框

android notification点击弹出对话框