【问题标题】:How to Force Android Soft Keyboard Open from Native Code?如何强制从本机代码打开 Android 软键盘?
【发布时间】:2011-11-16 11:01:26
【问题描述】:

我有一个游戏,它使用从 C++ 到 Java 的回调来在用户触摸屏幕时强制打开软键盘。 Java 代码就是这样的:

this._inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

这已经有一段时间了,但最近我们收到了一些摩托罗拉 Droid 用户的投诉,称软键盘无法为他们打开。由于我们最近才开始收到这些投诉,而且是很多用户,我认为这是对这些设备的某种更新。

有没有更好的方法可以强制键盘打开?我在网上找到的所有链接都在谈论使用文本框控件等,但我的应用程序主要是 C++,根本不使用标准控件。

【问题讨论】:

    标签: android android-ndk android-softkeyboard


    【解决方案1】:

    我不知道这是否与您的问题有关,但是当设备有时会“不同步”并在我想显示时隐藏时,我仅使用 InputMethodManager.toggleSoftInput() 时遇到了一些问题,反之亦然.

    我利用以下事实取得了一些成功:虽然 IMM.showSoftInput() 不会显示键盘,但 IMM.hideSoftInputFromWindow() 可靠关闭一个,所以当我想显示一个键盘时,我现在调用 IMM.hideSoftInputFromWindow(),然后调用 IMM.toggleSoftInput(),并单独使用 IMM.hideSoftInputFromWindow() 来隐藏一个。

    [一天后...]

    昨天写上面的内容让我重新思考我是如何处理软键盘的(我的意思是,showSoftinput() 确实工作,只是不是我们期望的那样),所以这里有一个更好的方法:

    首先,您需要设置您的视图,以便 Android 知道它可以有一个软键盘 - 在 InputMethodManager 的文档中进行了描述。就我而言,我有一个从 GLSurfaceView 派生的视图,因此我添加了:

    setFocusable(true);
    setFocusableInTouchMode(true);
    

    到构造函数,然后是以下 2 个覆盖:

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        outAttrs.actionLabel = "";
        outAttrs.hintText = "";
        outAttrs.initialCapsMode = 0;
        outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;
        outAttrs.label = "";
        outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI;        
        outAttrs.inputType = InputType.TYPE_NULL;        
    
        return  new BaseInputConnection(this, false);       
    }     
    
    @Override
    public boolean onCheckIsTextEditor ()
    {
        return true;
    }
    

    现在我可以显示键盘了:

    InputMethodManager mgr = (InputMethodManager)mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
    mgr.showSoftInput(mView, 0);
    

    按键通过视图的 onKeyUp() 和 onKeyDown() 方法得到报告。

    仍然使用 hideSoftInputFromWindow() 来隐藏它

    【讨论】:

    • 这是我听过的最好的建议。不幸的是,我无法在实际遇到问题的设备上对此进行测试,因为我们没有任何设备,但我会尝试一下。如果它有效,那么我会将其标记为答案。谢谢!
    • 尝试了这个和一些变体,但问题仍然出现在 Droid Bionic 上。我所做的一切似乎都无法成功打开该设备上的软键盘。
    • 您可以使用仿生设备吗?我真的很好奇键盘是否适用于“PocketSat3 Demo”(来自市场)。应用启动时会进行键盘兼容性测试。
    • 我自己没有;我认识一个为我测试这个的开发人员。
    • 在activity中去掉keyUp和keyDown,使用这种方法解决了键盘延迟的问题。 (它渲染在游戏窗口的顶部,延迟很烦人!)
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多