텍스트 변경 리스너의 안드로이드
두 개의 필드가있는 상황이 있습니다. field1
그리고 field2
. 내가하고 싶은 것은 바뀌었을 field2
때 비어 field1
있고 그 반대도 마찬가지입니다. 결국에는 하나의 필드에만 내용이 있습니다.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field1.setText("");
}
});
내가 첨부 할 경우 잘 작동 addTextChangedListener
에 field1
만,하지만 난 두 필드을 위해 그것을 할 때 응용 프로그램이 충돌합니다. 분명히 그들은 서로를 무한정으로 바꾸려고하기 때문입니다. 일단 field1
변경 되면 field2
이 순간에 지워 field2
지므로 변경 field1
됩니다.
누군가 해결책을 제안 할 수 있습니까?
필드의 텍스트가 비어 있지 않은 경우 (예 : 길이가 0과 다른 경우) 만 지우도록 검사를 추가 할 수 있습니다.
field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@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() != 0)
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@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() != 0)
field1.setText("");
}
});
TextWatcher
여기에 대한 설명서 .
또한 명명 규칙을 준수하십시오 .
나는 이것이 오래되었다는 것을 알고 있지만 언젠가 누군가가 이것을 다시 만날 수 있습니다.
EditText에서 setText를 호출하는 것과 비슷한 문제가 있었고 원하지 않는 경우 onTextChanged가 호출됩니다. 첫 번째 해결책은 setText ()를 호출 한 후 리스너가 수행 한 손상을 취소하기 위해 코드를 작성하는 것입니다. 그러나 그것은 매우 우아하지 않았습니다. 몇 가지 연구와 테스트를 거친 후 getText (). clear ()를 사용하면 setText ( "")와 거의 같은 방식으로 텍스트가 지워지지 만 텍스트를 설정하지 않으므로 리스너가 호출되지 않습니다. 내 문제를 해결했다. 모든 setText ( "") 호출을 getText (). clear ()로 전환했으며 더 이상 붕대가 필요하지 않았으므로 문제가 해결 될 수도 있습니다.
이 시도:
Field1 = (EditText)findViewById(R.id.field1);
Field2 = (EditText)findViewById(R.id.field2);
Field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
Field2.getText().clear();
}
});
Field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
Field1.getText().clear();
}
});
Android 개발에 Kotlin을 사용하는 경우 다음 TextChangedListener()
코드를 사용하여 추가 할 수 있습니다 .
myTextField.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
또한 동일한 문제에 직면하여 스택 전체 예외가 계속 발생하며 다음 솔루션이 제공됩니다.
edt_amnt_sent.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (skipOnChange)
return;
skipOnChange = true;
try {
//method
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
skipOnChange = false;
}
}
});
edt_amnt_receive.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (skipOnChange)
return;
skipOnChange = true;
try
{
//method
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
skipOnChange = false;
}
}
});
처음에 선언 boolean skipOnChange = false;
대답이 약간 늦었지만 재사용 가능한 솔루션은 다음과 같습니다.
/**
* An extension of TextWatcher which stops further callbacks being called as
* a result of a change happening within the callbacks themselves.
*/
public abstract class EditableTextWatcher implements TextWatcher {
private boolean editing;
@Override
public final void beforeTextChanged(CharSequence s, int start,
int count, int after) {
if (editing)
return;
editing = true;
try {
beforeTextChange(s, start, count, after);
} finally {
editing = false;
}
}
protected abstract void beforeTextChange(CharSequence s, int start,
int count, int after);
@Override
public final void onTextChanged(CharSequence s, int start,
int before, int count) {
if (editing)
return;
editing = true;
try {
onTextChange(s, start, before, count);
} finally {
editing = false;
}
}
protected abstract void onTextChange(CharSequence s, int start,
int before, int count);
@Override
public final void afterTextChanged(Editable s) {
if (editing)
return;
editing = true;
try {
afterTextChange(s);
} finally {
editing = false;
}
}
public boolean isEditing() {
return editing;
}
protected abstract void afterTextChange(Editable s);
}
따라서 위를 사용 setText()
하면 TextWatcher에서 발생 하는 모든 호출로 인해 TextWatcher가 다시 호출되지 않습니다.
/**
* A setText() call in any of the callbacks below will not result in TextWatcher being
* called again.
*/
public class MyTextWatcher extends EditableTextWatcher {
@Override
protected void beforeTextChange(CharSequence s, int start, int count, int after) {
}
@Override
protected void onTextChange(CharSequence s, int start, int before, int count) {
}
@Override
protected void afterTextChange(Editable s) {
}
}
hasFocus () 메소드를 사용할 수도 있습니다.
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (Field2.hasfocus()){
Field1.setText("");
}
}
사용자가 입력 한 온도 스케일을 변환하기 위해 노력하고있는 대학 과제에 대해 이것을 테스트했습니다. 완벽하게 작동했으며 훨씬 간단합니다.
다른 EditText
것을 비우기 전에 문자열을 확인하십시오 . 경우는 Field1
필요 ( "")로 다시 변경하는 이유를 다음 비어? 따라서 s.lenght () 또는 다른 솔루션으로 문자열의 크기를 확인할 수 있습니다
String의 길이를 확인할 수있는 또 다른 방법은 다음과 같습니다.
String sUsername = Field1.getText().toString();
if (!sUsername.matches(""))
{
// do your job
}
나는 이것을 위해 내 자신의 확장을 썼다. (코 틀린)
당신은 그렇게 쓸 수 있습니다 :
editText.customAfterTextChanged { editable ->
//You have accessed the editable object.
}
내 확장 :
fun EditText.customAfterTextChanged(action: (Editable?)-> Unit){
this.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun afterTextChanged(editable: Editable?) {
action(editable)
}
})}
참고 URL : https://stackoverflow.com/questions/20824634/android-on-text-change-listener
'IT story' 카테고리의 다른 글
img 태그의 src를 프로그래밍 방식으로 변경 (0) | 2020.04.21 |
---|---|
jQuery가 Ajax 호출이 종료되기 전에 대기하도록하려면 어떻게해야합니까? (0) | 2020.04.21 |
루비에서 구분 된 문자열을 분할하여 배열로 변환하는 방법은 무엇입니까? (0) | 2020.04.21 |
PowerShell을 사용한 재귀 파일 검색 (0) | 2020.04.21 |
Windows 배치 파일을 사용하여 텍스트 파일의 각 줄을 어떻게 반복합니까? (0) | 2020.04.21 |