Counting Chars in EditText Changed Listener
AndroidListenerAndroid EdittextOnchangeAndroid Problem Overview
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){}
});
Android Solutions
Solution 1 - Android
Use
s.length()
The following was once suggested in one of the answers, but its very inefficient
textMessage.getText().toString().length()
Solution 2 - Android
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 - Android
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 - Android
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.
##Supplemental image from this answer
Solution 5 - Android
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) {
}
};