Android 使用TextWatcher设置EditText中的最大字数限制

Android 使用TextWatcher设置EditText中的最大字数限制,android,string,split,android-edittext,android-textinputlayout,Android,String,Split,Android Edittext,Android Textinputlayout,我有一个EditText包装的TextInputLayout——它将获得一个组织的使命/愿景 TextInputLayout将通知还剩多少单词,如果遇到空格,它将拆分字符串 问题是它不计算单词,而是计算字符。 以下是我的示例代码: appCompatEditTextEventThirdContents.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSeq

我有一个
EditText
包装的
TextInputLayout
——它将获得一个组织的使命/愿景

TextInputLayout
将通知还剩多少单词,如果遇到空格,它将拆分字符串

问题是它不计算单词,而是计算字符。

以下是我的示例代码:

appCompatEditTextEventThirdContents.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) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        final int maxWords = 500;
        String[] words = s.toString().split(" ");
        int currentWords = words.length;
        try{
            if (currentWords < maxWords) {
                appCompatEditTextEventThirdContents.setHint("Third Paragraph " + (maxWords - currentWords) + "left");
            }
            else if (currentWords >= maxWords ){
                appCompatEditTextEventThirdContents.setHint("Exceeded 500 words.");

            }
        }catch (NumberFormatException e){
            e.printStackTrace();
        }
    }
});
AppCompativeTextEventThirdContents.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
最终整数maxWords=500;
String[]words=s.toString().split(“”);
int currentWords=words.length;
试一试{
if(当前字<最大字){
setHint(“第三段”+(maxWords-currentWords)+“左”);
}
else if(currentWords>=maxWords){
AppCompativeTextEventThirdContents.setHint(“超过500字”);
}
}捕获(数字格式){
e、 printStackTrace();
}
}
});
这是我的布局视图

<!--THIRD PARAGRAPH-->
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textInputThirdEventParag"
    android:hint="@string/paragThird"
    android:layout_below="@+id/textInputSecondEventParag"
    android:layout_centerHorizontal="true">

    <android.support.v7.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextPG3"
        android:scrollbars="vertical|horizontal"
        android:minLines="5"
        android:maxLines="10"
        android:maxLength="500"
        android:singleLine="false"/>

</android.support.design.widget.TextInputLayout>


.

属性
maxLength
限制
EditText
中的字符。因此,在您的情况下,需要删除该属性。您还需要删除
maxLines
属性

<android.support.v7.widget.AppCompatEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/editTextPG3"
    android:scrollbars="vertical|horizontal"
    android:minLines="5"
    android:singleLine="false"/>
现在声明一个函数来获取字数

private int getWordsCount(String input) {
    String trim = input.trim();
    if (trim.isEmpty())
        return 0;
    return trim.split("\\s+").length; // Separate string by spaces
}
现在,您必须添加一个
TextWatcher
,以便在
EditText
周围动态添加或删除
InputFilter

private final int MAX_WORD_LIMIT = 500;
private EditText mEditText = (EditText) findViewById(R.id.your_edit_text);

appCompatEditTextEventThirdContents.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        int totalWordCount = getWordCount(s.toString());

        // totalWordCount = 0 means a new word is going to start
        if (count == 0 && totalWordCount >= MAX_WORD_LIMIT) {
            forceFilter(mEditText, mEditText.getText().length());
            appCompatEditTextEventThirdContents.setHint("Exceeded 500 words.");
        } else {
            removeFilter(mEditText);
            appCompatEditTextEventThirdContents.setHint("Third Paragraph " + (maxWords - currentWords) + "left");
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {}
});

使用此选项无法处理粘贴事件中的最大字数。如果你想过滤粘贴事件,你可以看看

你能调试并发布你想要拆分的
s
吗?谢谢你的回答。我要试一试。:)
private final int MAX_WORD_LIMIT = 500;
private EditText mEditText = (EditText) findViewById(R.id.your_edit_text);

appCompatEditTextEventThirdContents.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        int totalWordCount = getWordCount(s.toString());

        // totalWordCount = 0 means a new word is going to start
        if (count == 0 && totalWordCount >= MAX_WORD_LIMIT) {
            forceFilter(mEditText, mEditText.getText().length());
            appCompatEditTextEventThirdContents.setHint("Exceeded 500 words.");
        } else {
            removeFilter(mEditText);
            appCompatEditTextEventThirdContents.setHint("Third Paragraph " + (maxWords - currentWords) + "left");
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {}
});