代码之家  ›  专栏  ›  技术社区  ›  sdabet

错误地将USB设备识别为键盘

  •  0
  • sdabet  · 技术社区  · 7 年前

    有没有办法显示连接了USB键盘的软件键盘(在我的例子中是RFID阅读器)?
    我试图使用InputManager(使用这些或类似的参数)强制显示它,但没有成功

    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    

    重要通知 -我知道状态/系统栏中有一个按钮可以显示它,但用户看不到这个按钮(Kiosk应用程序)。

    0 回复  |  直到 10 年前
        1
  •  18
  •   Andy Harris    14 年前

    即使有硬键盘,也需要重写InputMethodService方法OneEvaluateInputViewShowed()以将其计算为true。看见 onEvaluateInputShown() 以及 InputMethodService 。请尝试创建自己的自定义InputMethodService类以重写此方法。

    编辑:编辑 source for onEvaluateInputShown() 应该有帮助。解决方案应该很简单,只需创建自己的类来扩展InputMethodService,并重写这个方法,这个方法只有几行长。还要确保将自定义服务添加到清单中。

    来源:

    “重写此选项以控制何时向用户显示软输入区域。默认实现仅在没有硬键盘或键盘隐藏时显示输入视图。如果更改此返回值,则需要在返回值发生更改时自己调用UpdateInputViewShowed(),以便重新计算和应用它。”

    public boolean onEvaluateInputViewShown() {
         Configuration config = getResources().getConfiguration();
         return config.keyboard == Configuration.KEYBOARD_NOKEYS
                 || config.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_YES;
    }
    

    Here 是否可以检查可能的配置。配置键盘按键对应于没有硬件键盘。如果没有硬件键盘或硬件键盘隐藏,此方法将返回true(应显示软键盘)。即使连接了硬件键盘,删除这两个检查并简单地返回true也会使软件键盘可见。

    尝试(未测试):

    public boolean onEvaluateInputViewShown() {
         return true;
    }
    

    因为这个返回值不会改变,所以您不需要自己调用updateInputViewShowed()。如果以不同方式修改此方法,请务必记住此细节。

        2
  •  2
  •   Chibueze Opata    14 年前

    软键盘在不同的平台上可能有不可预测的行为。首先,在代码中,确保有一个可编辑的输入控件。例如,如果你有EditText,你可以使用:

    ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
        .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED);
    

    但是,您可以随时显示和隐藏它,使用:

    //show keyboard:
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    //hide keyboard :
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    

    你也可以在里面添加这些事件 OnCreate 或者其他一些控制方法。

    然而,如果由于某种原因上述任何一项都失败了,你最好的选择可能是使用另一种键盘,例如。 Compass Keyboard ,

    或

    你甚至可以建立自己的:

    看到了吗 example of a keyboard 实施 inputmethodservice.KeyboardView

    你可能还想看看 GingerBread Keyboard source.

        3
  •  1
  •   sdabet    7 年前

    如果你的应用程序有 WRITE_SECURE_SETTINGS 权限(可用于系统应用程序或Android Things应用程序)它可以设置 show_ime_with_hard_keyboard 即使插入硬键盘也能启用软键盘的系统设置:

    Settings.Secure.putInt(getContentResolver(), "show_ime_with_hard_keyboard", 1);
    
        4
  •  0
  •   nullpotent    14 年前

    有趣的是,这在我的应用程序中起了作用,也是一个kiosk应用程序。

    这有点简单,我事先做了一些检查,IMM是否为null等等。

    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
    
        5
  •  -1
  •   Community Mohan Dere    9 年前

    据此, https://stackoverflow.com/a/24287780/2233069 ,我为Kiosk模式制定了工作解决方案。

    boolean hardwareKeyboardPlugged=false;
    
    ....
    
    mEditText.setOnFocusChangeListener(this);//in onCreate()
    
    ....
    
    @Override
    public void onResume() {
        //protect from barcode scanner overriding keys
        hardwareKeyboardPlugged=(getResources().getConfiguration().hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO);
    
        super.onResume();
    }
    
    ....
    
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            if (hardwareKeyboardPlugged){
                //protect from barcode scanner overriding keys
                hardwareKeyboardPlugged=false;
                ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showInputMethodPicker();
                Toast.makeText(this, "USB device detected. Turn OFF hardware keyboard to enable soft keyboard!", Toast.LENGTH_LONG).show();
            }
    }
    
    推荐文章