Java 带GBoard输入的EditText的首字母大写

Java 带GBoard输入的EditText的首字母大写,java,android,android-keypad,capitalization,gboard,Java,Android,Android Keypad,Capitalization,Gboard,我正在尝试设置“首字母大写”程序(因为我在ListView中设置了一组EditText) 与这个问题相关的话题很多,我想最著名的是。我已经尝试了那里提供的解决方案 setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) 真的很有帮助。例外-当用户使用GBoard(谷歌键盘)时,它没有帮助。(自动大写未关闭) 那么,有没有可能让它在GBoard上工作?或者也许。。。当edittext中没有文本时

我正在尝试设置“首字母大写”程序(因为我在
ListView
中设置了一组
EditText

与这个问题相关的话题很多,我想最著名的是。我已经尝试了那里提供的解决方案

setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)
真的很有帮助。例外-当用户使用
GBoard
(谷歌键盘)时,它没有帮助。(自动大写未关闭)


那么,有没有可能让它在
GBoard
上工作?或者也许。。。当
edittext
中没有文本时,是否可以通过编程方式
按shift

我在Gboard上遇到了同样的问题,并通过以下方式解决了此问题:

final EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Check if the entered character is the first character of the input
        if(start == 0 && before == 0){
            //Get the input
            String input = s.toString();
            //Capitalize the input (you can also use StringUtils here)
            String output = input.substring(0,1).toUpperCase() + input.substring(1);
            //Set the capitalized input as the editText text
            editText.setText(output);
            //Set the cursor at the end of the first character
            editText.setSelection(1);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});
请注意,如果您真的需要在不支持首字母大写的键盘上完成工作,那么这只是一种变通方法

它将输入的第一个字符大写(忽略数字和特殊字符)。 唯一的缺陷是,键盘的输入(在我们的例子中是Gboard)仍然显示小写字母


有关ContextChanged参数的详细解释,请参见答案。

没有(已知我能找到)方法覆盖该参数。最好的选择(从不同制造商的角度来看,最安全的方法是一直使用android),是将您已经在做的事情与文本侦听器相结合,以大写字符序列的第一个字母(或者当字段失去焦点时,如果您的用户案例发生这种情况)。也可以把引号看作是一个标志,如果这是有效的(因为不管电路板的切换,它都会工作)。但总而言之,最好的解决方案是两者兼而有之。如果我错了,请纠正我,但这将禁止用户故意将第一个字母变小,例如删除大写字母并输入一个小写字母作为第一个字母?