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

Posted

技术标签:

【中文标题】带有 GBoard 输入的 EditText 的首字母大写【英文标题】:First letter capitalization for EditText with GBoard input 【发布时间】:2018-01-16 11:57:03 【问题描述】:

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

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

setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)

真的很有帮助。例外 - 当用户使用 GBoard (谷歌键盘) 它没有帮助。 (自动大写没有关闭)

那么,是否有可能让它为GBoard 工作?或者……当edittext 中没有文本时,是否可以以编程方式press shift

【问题讨论】:

没有(知道我能找到)方法来覆盖它。最好的选择(从不同的制造商混乱与 android-all-the-time 的角度来看是最安全的)是您已经在做的事情和文本侦听器的组合,以大写 CharSequence 的第一个字母(或者当字段失去焦点时,如果您的用户案例发生这种情况)。如果可行的话,也可以将 CapWords 视为一个标志(因为无论 Board 开关如何,它都会起作用)。但总而言之,最好的解决方案是两者兼而有之。 【参考方案1】:

我在使用 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) 
    
);

请注意,如果您确实需要在不支持 standard way 首字母大写的键盘上完成工作,这只是一种解决方法。

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

有关 onTextChanged 参数的详细说明,请参阅this 答案。

【讨论】:

如果我错了,请纠正我,但这会使用户无法故意将第一个字母变小,例如。删除大写字母并在第一个输入一个小写字母?

以上是关于带有 GBoard 输入的 EditText 的首字母大写的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式禁用 Gboard 上的自动建议

EditText 的首字母大写

Android EditText("Textbox") :在用户输入时自动大写每个单词的首字母

谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用

EditText中的标点符号 - Android Nougat

带有以下建议列表的 EditText