Counting Chars in EditText Changed Listener
In my project I have an EditText
. I want to count the characters in the EditText
, and show that number it in a TextView
. I have written the following code and it works fine. However, my problem is when I click Backspace it counts up, but I need to decrement the number. How can I consider 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){}
});
Solution 1:
Use
s.length()
The following was once suggested in one of the answers, but its very inefficient
textMessage.getText().toString().length()
Solution 2:
how about just getting the length of char in your EditText and display it?
something along the line of
tv.setText(s.length() + " / " + String.valueOf(charCounts));
Solution 3:
little few change in your code :
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){}
});
Solution 4:
This is a slightly more general answer with more explanation for future viewers.
Add a text changed listener
If you want to find the text length or do something else after the text has been changed, you can add a text changed listener to your edit text.
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) {
}
});
The listener needs a TextWatcher
, which requires three methods to be overridden: beforeTextChanged
, onTextChanged
, and afterTextChanged
.
Counting the characters
You can get the character count in onTextChanged
or beforeTextChanged
with
charSequence.length()
or in afterTextChanged
with
editable.length()
Meaning of the methods
The parameters are a little confusing so here is a little extra explanation.
beforeTextChanged
beforeTextChanged(CharSequence charSequence, int start, int count, int after)
-
charSequence
: This is the text content before the pending change is made. You should not try to change it. -
start
: This is the index of where the new text will be inserted. If a range is selected, then it is the beginning index of the range. -
count
: This is the length of selected text that is going to be replaced. If nothing is selected thencount
will be0
. -
after
: this is the length of the text to be inserted.
onTextChanged
onTextChanged(CharSequence charSequence, int start, int before, int count)
-
charSequence
: This is the text content after the change was made. You should not try to modify this value here. Modify theeditable
inafterTextChanged
if you need to. -
start
: This is the index of the start of where the new text was inserted. -
before
: This is the old value. It is the length of previously selected text that was replaced. This is the same value ascount
inbeforeTextChanged
. -
count
: This is the length of text that was inserted. This is the same value asafter
inbeforeTextChanged
.
afterTextChanged
afterTextChanged(Editable editable)
Like onTextChanged
, this is called after the change has already been made. However, now the text may be modified.
-
editable
: This is the editable text of theEditText
. If you change it, though, you have to be careful not to get into an infinite loop. See the documentation for more details.