Android 는 여러 개의 EditText 가 서로 감청 하 는 문제 와 해결 방법 을 실현 합 니 다.

지난주 에 한 기능 을 실 현 했 을 때 많은 문제 에 부 딪 혔 고, 그 후에 야 오랫동안 고생 을 해서 야 해결 되 었 으 며, 앞으로 또 같은 문제 에 부 딪 히 지 않도록 여기에 기록 하 였 다.
제 가 실현 하 는 기능 요 구 는 하나의 인터페이스 에 네 개의 EditText 컨트롤 이 있 는데 그 중에서 임의의 내용 변화 가 있 고 다른 세 가 지 는 모두 알고리즘 에 따라 해당 하 는 변 화 를 해 야 합 니 다. 이것 은 여러 개의 EditText 가 서로 감청 하 는 문제 와 관련 이 있 습 니 다.
EditText 의 감청 을 실현 하려 면 TextWatcher 를 사용 합 니 다.
우선 TextWatcher 의 사용법 을 알 아 보 겠 습 니 다!
기능:
1. EditText 에 입력 한 내용 의 변 화 를 감청 합 니 다.
2. 실시 간 으로 입력 한 문자 내용 에 따라 입력 자동 알림 효과
4. 567913. 여러분 은 각 매개 변수 가 인쇄 한 결과 에 따라 매개 변수 가 구체 적 으로 무엇 을 가리 키 는 지 알 수 있 습 니 다.
트리거 프로 세 스:
1.beforeTextChanged(CharSequence s,int start,int count,int after);
EditText 의 내용 이 변 하기 전에 촉발 합 니 다. EditText 의 내용 변 화 는 세 가지 방식 이 있 습 니 다.
1. 새 문자 추가 하기;2. 문자 삭제 하기;3. 입력 상자 의 몇 개의 문 자 를 바 꿉 니 다.
이 방법 은 EditText 가 변화 하기 전에 원래 의 내용 문자열 s 가 어떤 문자 가 어떤 변 화 를 일 으 킬 지 반영 합 니 다.
어떤 변화 방식 이 든 입력 상자 의 원본 문자열 s, 색인 위치 start 부터
count 문자 가 바 뀔 것 입 니 다.
이 count 문자 의 새 문자 개 수 를 after 로 바 꿉 니 다.
메모: s 는 변경 전의 입력 상자 내용 입 니 다.
2.onTextChanged(CharSequence s,int start,int before,int count);
EditText 의 내용 이 변 했 을 때 터치 합 니 다.
변 경 된 새로운 문자열 s 에 서 는 색인 위치 start 부터 count 문자 가 있 습 니 다. before 문 자 를 바 꾸 었 습 니 다.
메모: s 는 변 경 된 입력 상자 내용 입 니 다.
3.afterTextChanged(Editable s)
text 변화 후 촉발, s 는 최종 새로운 입력 상자 내용
문제 1:
그 다음 에 제 가 처음에 editext 의 TextWatcher 를 사용 하기 시 작 했 을 때 프로그램 을 실행 할 때 자바. lang. Stack Overflow Error 오류 가 발생 했 습 니 다.
분석 을 통 해 알 수 있 듯 이 setText () 방법 으로 EditText 에 데 이 터 를 추가 할 때마다 모니터 를 다시 터치 하고 재 귀적 으로 순환 하 며 마지막 프로그램 이 무 너 집 니 다.
이것 에 대해 나 는 두 가지 해결 방안 을 시험 해 보 았 다.
1. flag 를 설정 합 니 다. 예:
TextWatcher myWatcher = newTextWatcher(){

@Override
public void onTextChanged(CharSequence s,int start,int before,int count){
     System.out.println("onTextChanged");
     System.out.println("s = "+s+",start = "+start+",before = "+before+",count = "+count);
}

@Override
public void beforeTextChanged(CharSequence s,int start,int count,int after){
     System.out.println("beforeTextChanged");
     System.out.println("s = "+s+",start = "+start+",count = "+count+",after = "+after);
}

@Override
public void afterTextChanged(Editable s){
     System.out.println("afterTextChanged");
     System.out.println("s = " + s);
}
};

2. 텍스트 를 설정 할 때마다 원래 의 감청 을 제거 하고 감청 을 리 셋 합 니 다.
private boolean autochange = false;

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if(autochange) { // skip execution if triggered by code
       autochange=false; // next change is not triggered by code
       return;
    }
    if (s.length() != 0) {
        switch (et.getId()) {
        case R.id.etUsername: {

        }
        break;

        case R.id.etPassword: {
            phone = formatPhoneNumber(phone);
            Log.i("PHONE", "Phone NUMB IS:"+phone);
            autochange=true;
            mPassword.setText(phone); 
        }
        }
    }
}   

문제 2:
오류: android. content. res. Resource $NotFoundException
원인: 일반적으로 인자 int resId 오류 가 발생 합 니 다. int 의 resId 에 String 값 을 부여 하기 때문에 컴 파일 러 가 정확 한 resource 를 찾 지 못 해서 오 류 를 보고 합 니 다.
edittext. setText 와 같은 함 수 를 검사 하 십시오. 이 함 수 는 보통 몇 개의 과부하 가 있 습 니 다. 예 를 들 어:
editText.setText(CharSequence text);
editText.setText(int resId);
......
만약 조심 하지 않 아 int 값 을 그것 에 게 전달 했다 면, int 값 을 표시 하지 않 고, 프로젝트 로 내 려 가서 대응 하 는 resource 의 id 를 찾 았 을 것 입 니 다. 당연히 찾 을 수 없 기 때문에 잘못 보 고 했 습 니 다.해결 방법 은 String. valueOf 를 사용 하 는 것 입 니 다. 예:
count.setText(String.valueOf(incall.getCount())); 
문제 3:
여러 개의 EditText 가 서로 죽은 순환 을 감청 합 니 다. 모든 EditText 가 초점 을 맞 출 때 텍스트 변 화 를 감청 할 수 있 습 니 다. 즉, edittext 에 setOnTouchListener 를 설정 한 다음 이 아래 에서 TextWatcher 를 진행 합 니 다.

좋은 웹페이지 즐겨찾기