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 中输入文本的主要内容,如果未能解决你的问题,请参考以下文章
android:自定义可输入对话框,EditText已经获得焦点,为啥就是不弹出输入法呢?