在EditText更改侦听器中计数字符


272

在我的项目中,我有一个EditText。我想计算中的字符EditText,并在中显示该数字TextView。我写了下面的代码,它工作正常。但是,我的问题是,当我单击Backspace它时,它会递增计数,但是我需要减少数字。我该如何考虑Backspace

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

36
请原谅不相关的内容,但我很好奇您如何在问题格式中放置“退格键”?我曾问过类似的问题,这种技术在什么地方会非常有用。
AlleyOOP,2014年

59
将您的单词(在本例中为Backspace)放在<kbd> </ kbd>标签之间,例如:<kbd> Backspace </ kbd>
Hesam 2014年

2
每当您看到有趣的格式(例如“退格”)时,都可以随时单击“编辑”链接来查看作者的操作方式。然后只需点击“取消”即可放弃您的修改。
Suragch '16

Answers:


142

s.length()

以下是曾经在其中一个答案中提出的建议,但其效率很低

textMessage.getText().toString().length()


28

您的代码中的几处更改:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

1
这将无法正常工作-length()返回一个int并且setText需要一个字符串
Martin Lockett 2015年

1
@MartinLockett使用Integer.toString(int_type)将字符串转换为int。
Mehdi

6

这是一个较为笼统的答案,并为以后的观众提供了更多解释。

添加文本更改的侦听器

如果要查找文本长度或在更改文本后执行其他操作,可以将文本更改后的侦听器添加到编辑文本中。

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

    }

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

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

监听器需要TextWatcher,这需要三种方法来覆盖:beforeTextChangedonTextChanged,和afterTextChanged

计数字符

你可以得到字符计数onTextChangedbeforeTextChanged

charSequence.length()

afterTextChanged

editable.length()

方法的含义

参数有些混乱,因此这里有一些额外的说明。

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence:这是进行暂挂更改之前的文本内容。您不应该尝试更改它。
  • start:这是新文本插入位置的索引。如果选择了一个范围,则它是该范围的开始索引。
  • count:这是将要替换的所选文本的长度。如果什么都没有选择,那么count将是0
  • after:这是要插入的文本的长度。

onTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence:这是更改后的文本内容。您不应在此处尝试修改此值。修改editableafterTextChanged,如果你需要。
  • start:这是插入新文本的起点的索引。
  • before:这是旧值。它是先前选择的文本的长度。这是相同的值countbeforeTextChanged
  • count:这是插入的文本的长度。这是相同的值afterbeforeTextChanged

afterTextChanged

afterTextChanged(Editable editable)

像一样onTextChanged,这是在进行更改后调用的。但是,现在可以修改文本。

  • editable:这是的可编辑文本EditText。但是,如果更改它,则必须小心不要陷入无限循环。有关更多详细信息,请参见文档

此答案的补充图片

在此处输入图片说明


0

TextWatcher maritalStatusTextWatcher = 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 {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.