사용자가 EditText 필드에 일부 데이터를 입력 할 수있는 양식이 있습니다. 이 EditText 위젯 중 하나는 이메일 주소입니다. 나는 다음과 같이 텍스트가 항상 소문자로되어 있는지 확인하기 위해 TextWatcher를 사용하고 다음 onTextChanged(...)
에서안드로이드 - EditText 소문자를 유지하는 TextWatcher는 캐럿 (입력 커서) 위치를 유지할 수 없습니다.
txtEmail.addTextChangedListener(new TextWatcher()
{
String prevString = "";
boolean delAction = false;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.length() < prevString.length())
delAction = true;
else
delAction = false;
}
@Override
public void afterTextChanged(Editable s)
{
if (!delAction)
{
String temp = s.toString().toLowerCase();
if (!temp.equals(prevString))
{
prevString = temp;
txtEmail.setText(temp); // Recursive
txtEmail.setSelection(temp.length());
}
}
else
{
prevString = s.toString();
}
}
});
나는 또한 비교를하고 제대로 확인하십시오 삭제 작업을 할 수 있습니다.
문제가 생겼습니다. txtEmail.setText(temp);
은 전체 감시자가 재귀 적으로 실행되도록합니다. txtEmail.setSelection(temp.length());
을 추가하여 EditText의 끝으로 이동하고 if
과 함께 재귀 루프를 이스케이프 처리하는 캐럿 위치를 제어 할 수 있지만 특정 지점에서 캐럿을 유지할 수있는 방법을 찾을 수 없습니다. 예를 들어 "myema (il missing) @ something.com"이라고 쓰고 각 문자를 입력 할 때마다 교정을하려고한다면 캐럿은 문자열의 끝에갑니다.
지금 이상한 부분입니다. beforeTextChanged(...)
또는 onTextChanged(...)
앞에있는 캐럿의 위치 내가 입력 할 때마다 캐럿 위치가 모든 경우에 적절히 변경됩니다. 그러나 재귀 호출을 입력하면 캐럿의 위치가 0으로보고됩니다. 실제로 입력 할 때 캐럿 이동도 등록되지만 재귀 호출에는 EditText에서 텍스트를 "붙여 넣기"하는 것이 아니라 캐럿 이동이 없으므로 위치 변경이 없습니다.
따라서 질문 : 어떻게 할 수 있습니까? 나는 캐럿의 위치를 유지합니까? 실제로 텍스트를 하위 문자열로 묶는 것이 었습니다. 캐럿에 대한 모든 것을 가져 와서 변경 사항을 txtEmail.setSelection(temp.length());
으로 던져 버린 다음 나머지 단계를 추가합니다 (아직 시도하지 않았습니다). inbuilt 도구로 처리 할 수있는 다른 (더 간단하고 효율적인) 방법이 있습니까?
미리 감사드립니다.
왜에 배치해야합니까 : OP BY
편집 : 다음과 같이
Alexandru의 조언을 따른 후 (설명 참조)의 등록을 취소하고 다시 TextWatcher를 등록하려면, 코드 변경 및 작동 어쨌든 끝이야? – creativecreatorormaybenot