如何在Android键盘上触发shift键?

时间:2017-01-02 10:56:04

标签: android android-softkeyboard

如何在Android键盘上触发“shift-button”,以便下一个角色成为大写?

我将InputType设置为InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE,但如果光标位于该行的任何位置,则无效。

我试过these two methods。两者都不起作用。第二个抛出RuntimeException(“无法从主应用程序线程调用此方法”)。也许是因为这个按钮没有键码。 有没有办法触发按钮?

1 个答案:

答案 0 :(得分:1)

编辑:

似乎像shift和alt这样的按钮会创建影响按下按钮的元状态。来自https://developer.android.com/reference/android/view/KeyEvent.html

  

Meta状态描述了键修饰符的按下状态,例如META_SHIFT_ON或META_ALT_ON。

这些元状态可以使用dispatchKeyEvent进行模拟,如下所示:

dispatchKeyEvent(new KeyEvent(0,0,KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_L,0,KeyEvent.META_SHIFT_ON));

如果焦点为EditText,则会将“L”写入其中。但似乎您不仅可以发送班次KeyEvent并期望下一个字符为大写。也许你可以想出一些解决方法。

您正在使用EditText,对吗?由于某种原因,我无法得到

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_SHIFT_LEFT));

在EditText聚焦时工作,而KeyEvents用于字母和数字工作。

解决方法可能是向TextWatcher添加EditText

editText.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged: "+s.toString());
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            Log.d(TAG, "beforeTextChanged: "+s.toString());
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged: "+s.toString());
        }
    });

并检查CharSequence s中所需的字符是否在afterTextChanged中大写。如果没有,则将其更改为大写版本。这有点hacky并没有完全回答我的问题,但不幸的是我无法发表评论。