我想知道如何创建一个自定义的弹出框,就像下面截图中所示(来自Swype键盘),在其中可以有几个按钮,每个按钮都可以提交一个字符串到当前“连接”的TextView
(通过InputConnection)。
请注意:这是一个InputMethodService而不是普通的Activity
。我已经尝试使用Theme:Dialog
启动单独的Activity
。 然而,一旦打开它,我便失去了与TextView
的焦点,我的键盘消失了(因此我的InputConnection
也不见了)。
我想知道如何创建一个自定义的弹出框,就像下面截图中所示(来自Swype键盘),在其中可以有几个按钮,每个按钮都可以提交一个字符串到当前“连接”的TextView
(通过InputConnection)。
请注意:这是一个InputMethodService而不是普通的Activity
。我已经尝试使用Theme:Dialog
启动单独的Activity
。 然而,一旦打开它,我便失去了与TextView
的焦点,我的键盘消失了(因此我的InputConnection
也不见了)。
祝福那些遵循指引的人们平安无事,
解决方案:
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 是你键盘类的通用名称..请参阅
@Override
public View onCreateInputView() {
mInputView =(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
....
}
正确的答案:
这将像您的截图中一样,在IME上方显示您的弹出窗口。
我也曾在这个问题上苦苦思索,最终找到了解决方法。上面的解决方案是正确的,但正如你所指出的,它们不能从InputMethodService中使用,因为它不是一个Activity。诀窍是在KeyboardView的子类中创建PopupWindow。通过使用负Y位置,PopupWindow可以像Swype一样出现在键盘上方。
祝好运, 巴里
PopupWindow
还是其他什么东西?你能提供一些指针吗? - Johan Walles