我有一个软键盘作为调用活动的inputmethodservice。按下按钮并激活扫描仪。扫描程序活动捕获一组数据,然后将数据返回到inputmethodservice以填充浏览器上的文本字段。
如何将活动的扫描值返回到inputmethodservice?
感谢您的帮助。
答案 0 :(得分:2)
您通常无法通过服务执行此操作。由于Service不是Activity,因此无法从Activity接收结果,因此没有startActivityForResult()。
实际上你可能不想这样做。开始活动充其量只是一种笨重的体验 - 在字段中输入的用户并不真正希望将上下文切换到另一个应用程序的活动作为其输入的一部分。
更糟糕的是,这为许多丑陋的互动打开了大门。例如,如果他们回家或使用通知或最近的应用程序切换到另一个应用程序,您的活动会发生什么?可能没什么好的。
相反,我建议只显示一个对话框作为IME的一部分 - 使用Dialog类并将其窗口类型设置为TYPE_INPUT_METHOD_DIALOG。这将显示在您的IME之上,允许您与用户交互而不会中断编辑会话。例如,您需要将此对话框设置为不使用FLAG_NOT_FOCUSABLE进行输入焦点,以便用户执行输入的文本编辑会话不会中断。
老实说,最好的办法是将你的用户界面纳入IME本身。
答案 1 :(得分:1)
以下是使用Dialog测试解决方案的代码:
// 1. CREATE THE DIALOG
val builder: AlertDialog.Builder = AlertDialog.Builder(this, R.style.Theme_AppCompat_Light)
builder.setTitle("Title").setMessage("This is the message for the user. ")
val mDialog = builder.create()
// 2. SET THE IME WINDOW TOKEN ATTRIBUTE WITH THE TOKEN OF THE KEYBOARD VIEW
mDialog.window?.attributes?.token = this.mKeyboardView.windowToken
// 3. SET THE TYPE OF THE DIALOG TO TYPE_APPLICATION_ATTACHED_DIALOG
mDialog.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)
// 4. SHOW THE DIALOG
mDialog.show()
答案 2 :(得分:-1)
你想要的是startActivityForResult(yourIntent, SCAN_VALUE).你的IME将启动活动,然后将一个值返回给IME。
因此,您的服务将执行以下操作:
Intent yourIntent = new Intent(this , YourActivity.class);
this.startActivityForResult(yourIntent, SCAN_VALUE);
同样在您的服务中,您必须致电onActivityResult():
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch(requestCode) {
case SCAN_VALUE:
if (resultCode == RESULT_OK) {
//TODO: Create some functionality here!
break;
}
好的,现在让我们来解决你发起的活动。你必须修改它以适合你的目的,但是这里是你如何从ListAdapter发回一个值。你没有发布你的代码,所以很难确切知道你在做什么。
Object o = this.getListAdapter().getItem(position);
String scanValue = o.toString();
Intent returnIntent = new Intent();
returnIntent.putExtra("ScanValue", scanValue);
setResult(RESULT_OK,returnIntent);
finish();
这将向IME返回一个值,以字符串形式启动活动。同样,如果您发布代码,我可以给您更准确的说明。我希望这可以帮助你在此期间围绕startActivityForResult()进行思考。