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

59
<kbd> Backspace </ kbd>
Hesam

2
"backspace"와 같은 흥미로운 서식이 나타날 때마다 항상 "edit"링크를 클릭하여 작성자가 어떻게 수행했는지 확인할 수 있습니다. 그런 다음 "취소"를 클릭하여 편집 내용을 취소하십시오.
Suragch

답변:


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

1
@MartinLockett은 Integer.toString (int_type)을 사용하여 문자열을 int로 변환합니다.
Mehdi Rostami

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,이 필요 beforeTextChanged하며 onTextChanged,, 및 세 가지 메소드를 재정의해야합니다 afterTextChanged.

문자 수

당신의 글자 수를 얻을 수 있습니다 onTextChanged또는 beforeTextChanged함께

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: 이것은 오래된 값입니다. 대체 된 이전에 선택한 텍스트의 길이입니다. 이는에서와 동일한 값 count입니다 beforeTextChanged.
  • count: 삽입 된 텍스트 길이입니다. 이는에서와 동일한 값 after입니다 beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

마찬가지로 onTextChanged변경이 이미 완료된 후에 호출됩니다. 그러나 이제 텍스트가 수정 될 수 있습니다.

  • editable:의 편집 가능한 텍스트입니다 EditText. 그러나 변경하면 무한 루프에 빠지지 않도록주의해야합니다. 자세한 내용은 설명서 를 참조하십시오.

이 답변의 보충 이미지

여기에 이미지 설명을 입력하십시오


0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@ 공개 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) {

    }
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.