【问题标题】:Android: switch to a different IME programmaticallyAndroid:以编程方式切换到不同的 IME
【发布时间】:2013-05-17 01:47:46
【问题描述】:

http://developer.android.com/guide/topics/text/creating-input-method.html#GeneralDesign 阅读:

由于设备上可能安装了多个 IME,因此为用户提供一种直接从输入法 UI 切换到不同 IME 的方式。

假设我有两个输入法的来源并且可以修改它。 我想让用户在它们之间快速切换,并准备为此保留一个按钮。 如何“直接从输入法 UI 切换到不同的 IME”?

【问题讨论】:

    标签: android ime


    【解决方案1】:

    切换到上一个输入法从当前输入法是:

    //final String LATIN = "com.android.inputmethod.latin/.LatinIME";
    // 'this' is an InputMethodService
    try {
        InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        final IBinder token = this.getWindow().getWindow().getAttributes().token;
        //imm.setInputMethod(token, LATIN);
        imm.switchToLastInputMethod(token);
    } catch (Throwable t) { // java.lang.NoSuchMethodError if API_level<11
        Log.e(TAG,"cannot set the previous input method:");
        t.printStackTrace();
    }
    

    如果您想切换到您知道其 ID 的特定输入法,您可以按照注释掉的行的建议进行操作。

    编辑@pRaNaY 在静默编辑中建议了一个.getWindow()(单击下面的“已编辑”以查看历史记录)。我记得它不适用于 Android 2.3;如果您查阅文档,您会看到第一个调用 InputMethodService.getWindow() 返回一个 Dialog(它不是 Window 的子类),第二个调用 Dialog.getWindow() 返回一个 Window。没有Dialog.getAttributes(),所以只有一个.getWindow(),它甚至都无法编译。

    【讨论】:

    • 但是如何获取最终 IBinder 令牌的服务类实例 = this.getWindow().getWindow().getAttributes().token;
    • @Ram 如果你的项目是 InputMethodService,并且它当前被用户选择,这是你的服务。
    • 我很困惑,这个解决方案是不是与@Raghav Sood 所说的相矛盾——出于安全原因,这是不允许的?
    • @RonenRabinovici 安全检查是 setInputMethod() 只能从具有当前活动输入法令牌的应用程序或服务中调用。
    【解决方案2】:

    出于安全原因,您不能通过代码更改用户当前活动的 IME,抱歉。

    但是,您可以显示系统提供的对话框,以允许用户选择其他已启用的对话框之一。

    InputMethodManager imeManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imeManager != null) {
        imeManager.showInputMethodPicker();
    } else {
        Toast.makeText(context ,"Error", Toast.LENGTH_LONG).show();
    }
    

    【讨论】:

    • 显示切换器对话框的意思,由系统提供。如果不显示此对话框,您将无法执行此操作。
    • 那么我将如何调用该切换器对话框?请注意,我正在编写输入法,而不是应用程序。
    • 对不起,如果我错过了理解,接受的答案不提供解决方案吗?
    • @RaghavSood 如果您使用它,如果键盘不在列表中,则会出现设置输入法按钮。它已从 Android 7.0 Nougat 停止工作。 :(
    【解决方案3】:

    如果你有 root 设备,你可以使用 /system/bin/ime 工具。

    列出所有已安装的输入法:#ime list -a

    将谷歌的键盘设置为默认:

    ime set com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2011-09-27
      • 2012-02-01
      相关资源
      最近更新 更多