2011-08-28 64 views
3

我有一个软键盘作为inputmethodservice调用的活动。按下按钮并启动扫描仪。扫描器活动捕获一组数据,然后将数据返回到inputmethodservice以填充浏览器上的文本字段。如何从inputmethodservice呼叫活动,并得到响应

如何返回活动的扫描值回inputmethodservice?

感谢您的任何帮助。

回答

0

你想要的是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()。

+0

我认为那不是重点。问题是'startActivityForResult'是Activity类的一个方法。因此,它不可用InputMethodService ...:/ –

2

您通常不能通过服务完成此操作。由于服务不是活动,它不能从活动接收结果,因此不具有startActivityForResult()。

事实上,你可能不希望这样做。开始一个活动最好是一个笨拙的经历 - 用户在一个字段中输入内容并不是真正想要将上下文切换到另一个应用程序的活动作为其输入的一部分。

更糟的是,这将打开大门,很多丑陋的相互作用。例如,如果他们按回家或使用通知或最近的应用程序切换到另一个应用程序,您的活动会发生什么?可能没什么好。

相反,我会建议只显示一个对话框作为输入法的一部分 - 使用对话框类,并将其窗口类型设置为TYPE_INPUT_METHOD_DIALOG。这将显示在IME之上,允许您在不中断编辑会话的情况下与用户进行交互。例如,您需要将此对话框设置为不使用FLAG_NOT_FOCUSABLE的输入焦点,以便用户正在执行输入的文本编辑会话不会中断。

老实说做的最好的事情是让你的UI纳入IME本身。

+0

我不喜欢“你不能这样做,因为它很糟糕”的答案...如果我们需要可以'startActivityForResult',因为没有其他方法可以访问任何内建的Intent? –

+0

@Orabîg不,如果一个Android框架工程师告诉你:) –

+0

@hackbod你可能会发布一个示例,如何在服务中使用窗口类型设置为TYPE_INPUT_METHOD_DIALOG的对话框? –

相关问题