Android EditText输入使每一个单词首字母大写

前言

官方解释在对EditText设置属性:android:inputType="textCapWords"会使每一个单词首字母大写,但是实际发现并没有什么卵用,不知道是怎么回事?(如果知道原因的,请告知!),下面说一下方案!

方案

在Stackoverflow上面找到一个回答,使用TextWatcher可以算是能够实现这一目的!
Motorola Bionic - input type textPersonName and textCapWords not working

public class WordUtil {

    public static String capitalize(String str) {
        return capitalize(str, (char[]) null);
    }

    public static String capitalize(String str, char... delimiters) {
        int delimLen = delimiters == null ? -1 : delimiters.length;
        if (!TextUtils.isEmpty(str) && delimLen != 0) {
            char[] buffer = str.toCharArray();
            boolean capitalizeNext = true;

            for (int i = 0; i < buffer.length; ++i) {
                char ch = buffer[i];
                if (isDelimiter(ch, delimiters)) {
                    capitalizeNext = true;
                } else if (capitalizeNext) {
                    buffer[i] = Character.toTitleCase(ch);
                    capitalizeNext = false;
                }
            }

            return new String(buffer);
        } else {
            return str;
        }
    }

    private static boolean isDelimiter(char ch, char[] delimiters) {
        if (delimiters == null) {
            return Character.isWhitespace(ch);
        } else {
            char[] arr$ = delimiters;
            int len$ = delimiters.length;

            for (int i$ = 0; i$ < len$; ++i$) {
                char delimiter = arr$[i$];
                if (ch == delimiter) {
                    return true;
                }
            }

            return false;
        }
    }
}

然后在activity中:

TextWatcher capitalizeTW = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try{
            String inputString = ""+YOUR_TEXT_VIEW.getText().toString();
            String firstLetterCapString = WordUtil.capitalize(inputString);
            if(!firstLetterCapString.equals(""+YOUR_TEXT_VIEW.getText().toString())){
                YOUR_TEXT_VIEW.setText(""+firstLetterCapString);
                YOUR_TEXT_VIEW.setSelection(YOUR_TEXT_VIEW.getText().length());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};

为EditText添加TextWatcher:

YOUR_TEXT_VIEW.addTextChangedListener(capitalizeTW);

对于TextView,同样的可以使用类似的方案,只不过不用设置TextWatcher,直接调用一下相关的代码手动转换一下即可。

其他相关

设置全部大写

android:textAllCaps="true"这个属性,对TextView会使全部字母大写,但是对于EdidText,则不能使用此属性,在xml中会报错IndexOutOfBoundsException,在代码中设置,虽然不报错,但是并没有什么用,如果想使EditText中输入全部大写,也行我们会想到android:inputType="textCapCharacters",但是同样的这个属性也并没有什么卵用。所以对应的解决方案:
方案①:同样的,我们可以使用上面添加TextWatcher的方法来解决。
方案②:可以参考这篇文章:设置EditText输入的文字全部变成大写或小写

另外Button中,如果text中有英文,则会默认全部大写,我们可以设置textAllCaps为false,使其变为小写!

EditText的inputType属性

    //文本类型,多为大写、小写和数字符号。
    android:inputType="none"
    android:inputType="text"
    android:inputType="textCapCharacters" //字母大写
    android:inputType="textCapWords" //首字母大写
    android:inputType="textCapSentences" //仅第一个字母大写
    android:inputType="textAutoCorrect" //自动完成
    android:inputType="textAutoComplete" //自动完成
    android:inputType="textMultiLine" //多行输入
    android:inputType="textImeMultiLine" //输入法多行(如果支持)
    android:inputType="textNoSuggestions" //不提示
    android:inputType="textUri" //网址
    android:inputType="textEmailAddress" //电子邮件地址
    android:inputType="textEmailSubject" //邮件主题
    android:inputType="textShortMessage" //短讯
    android:inputType="textLongMessage" //长信息
    android:inputType="textPersonName" //人名
    android:inputType="textPostalAddress" //地址
    android:inputType="textPassword" //密码
    android:inputType="textVisiblePassword" //可见密码
    android:inputType="textWebEditText" //作为网页表单的文本
    android:inputType="textFilter" //文本筛选过滤
    android:inputType="textPhonetic" //拼音输入 //数值类型
    android:inputType="number"// 数字
    android:inputType="numberSigned" //带符号数字格式
    android:inputType="numberDecimal" //带小数点的浮点格式
    android:inputType="phone" //拨号键盘
    android:inputType="datetime" //时间日期
    android:inputType="date" //日期键盘
    android:inputType="time" //时间键盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值