Android输入法:展示一个自定义弹出对话框(类似Swype键盘),可以将文本输入到TextView中。

5

我想知道如何创建一个自定义的弹出框,就像下面截图中所示(来自Swype键盘),在其中可以有几个按钮,每个按钮都可以提交一个字符串到当前“连接”的TextView(通过InputConnection)。

请注意:这是一个InputMethodService而不是普通的Activity。我已经尝试使用Theme:Dialog启动单独的Activity。 然而,一旦打开它,我便失去了与TextView的焦点,我的键盘消失了(因此我的InputConnection也不见了)。

Swype

4个回答

2
您可以尝试使用PopupWindow。您需要进行一些调整以使其按照您的要求工作,而唯一好的文档是源代码。

很好,谢谢你的提示。我已经在查看Android键盘源代码了,所以我对此非常熟悉 :-) - znq
@znq,你真的做到了吗?你最终是使用了 PopupWindow 还是其他什么东西?你能提供一些指针吗? - Johan Walles
在你的KeyboardView子类中创建PopupWindow非常重要,而不是在InputMethodService或其他任何地方。如果您希望它出现在键盘上方,请使用负Y位置。 - Barry Fruitman
1
我找到了解决方法;在使用弹出窗口之前,您只需调用PopupWindow.setClippingEnabled(false),否则您的负Y坐标将无法正常工作。已添加为下面的答案。 - Johan Walles

1

祝福那些遵循指引的人们平安无事,

解决方案:

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);
....
}

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

1

在Android P中无法工作,即使Y坐标为负数。除非我们将窗口布局类型设置为TYPE_APPLICATION_OVERLAY,这需要SYSTEM_ALERT权限。 - elsennov
@elsennov 我有一个应用程序正在这样做。我的手机是安卓P,这对我有效:https://github.com/walles/exactype/blob/2d0f3175012369bc50bc7a992a9d03de39db363e/app/src/main/java/com/gmail/walles/johan/exactype/Exactype.java#L351 - Johan Walles
抱歉,之前没有说明。我的意思是,并非所有的Android P都适用。我在我的设备三星S9上测试了它,它可以工作。但是当我在模拟器(Google Pixel,Android P)上测试时,它无法正常工作。@JohanWalles - elsennov
我只在S9上测试过,没有在模拟器上测试过。如果在那里不起作用,那我就不知道了,抱歉。 - Johan Walles

1

我也曾在这个问题上苦苦思索,最终找到了解决方法。上面的解决方案是正确的,但正如你所指出的,它们不能从InputMethodService中使用,因为它不是一个Activity。诀窍是在KeyboardView的子类中创建PopupWindow。通过使用负Y位置,PopupWindow可以像Swype一样出现在键盘上方。

祝好运, 巴里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接