2012-06-21 1 views
79

TextWatcher에 대해 조금 알고 있지만 입력 한 모든 문자가 실행됩니다. 사용자가 편집을 마칠 때마다 발생하는 리스너를 원합니다. 가능한가? 또한 TextWatcher에서 나는 Editable의 인스턴스를 얻지 만 인스턴스는 EditText이어야합니다. 어떻게해야합니까?android edittext onchange listener

편집 : 두 번째 질문이 더 중요합니다. 대답 해주세요.

+1

시도 주어진 후 //Do stuff 자신의 원하는 코드를 실행하기 위해 수표를 구현할 수 즉, 사용자가 편집을 시작했음을 의미하고 editText가 포커스를 잃으면 편집이 완료되었음을 의미합니다. – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

답변

156

먼저 EditText이 포커스를 잃었거나 사용자가 완료 버튼을 누르면 텍스트 편집을 완료했는지 확인할 수 있습니다 (구현 및 사용자에게 가장 적합한 방식에 따라 다름). 두 번째로 EditText을 인스턴스 객체로 선언 한 경우에만 텍스트 워처 내에 EditText 인스턴스를 가져올 수 없습니다. 비록 그것이 안전하지 않기 때문에 textwatcher 내의 EditText을 편집하면 안됩니다.

편집 : 위의 샘플은 약간의 오차가있을 수 있지만, 난 그냥 싶다고

public class YourClass extends Activity { 

private EditText yourEditText; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     yourEditText = (EditText) findViewById(R.id.yourEditTextId); 

     yourEditText.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      // you can call or do what you want with your EditText here 
      yourEditText. ... 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

      public void onTextChanged(CharSequence s, int start, int before, int count) {} 
     }); 
    } 

} 

참고 :

당신이 이런 식으로 뭔가를 시도해야 당신의 TextWatcher 구현에 글고 인스턴스를 얻을 수있을하려면 예를 보여주세요.

1

내가 생각할 수있는 한 두 가지 방법 만 있습니다. 사용자가 단어 작성을 마쳤다는 것을 어떻게 알 수 있습니까? 초점을 잃었거나 "확인"버튼을 클릭하십시오. 사용자가 마지막 문자를 눌렀다는 것을 알 수있는 방법이 없습니다 ...

그래서 onFocusChange(View v, boolean hasFocus)을 호출하거나 단추와 클릭 수신기를 추가하십시오.

2

TextWatcher은 모두 EditText에 대해 계속 발사하고 서로 값을 어지럽히면서 계속 작동하지 않았습니다.

public class ConsultantTSView extends Activity { 
    ..... 

    //Submit is called when I push submit button. 
    //I wanted to retrieve all EditText(tsHours) values in my HoursList 

    public void submit(View view){ 

     ListView TSDateListView = (ListView) findViewById(R.id.hoursList); 
     String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString(); 
    } 
} 

따라서 getChildAt(xx) 방법을 사용하여 당신이 ListView의 모든 항목을 검색하고 findViewById를 사용하여 개별 항목을 얻을 수 있습니다 :

여기 내 솔루션입니다. 그런 다음 가장 최근의 가치를 부여합니다. 내가 AutotextView를 사용했을

4

:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview); 
textView.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     seq = cs; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     new SearchTask().execute(seq.toString().trim()); 
    } 

}); 
8

ButterKnife를 사용하는 사람. 그것은 나를 귀찮게했다

@OnTextChanged(R.id.zip_code) 
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) { 

} 
7

내 글고 필드의 모든 리스너를 구현하는 그래서 아래의 클래스를 쓴 저 못생긴, 자세한 코드를 가지고 있어야한다는 :처럼 당신은 사용할 수 있습니다. 이 문제에 걸림돌이되는 사람에게 유용 할 수 있습니다.

public abstract class TextChangedListener<T> implements TextWatcher { 
    private T target; 

    public TextChangedListener(T target) { 
     this.target = target; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void afterTextChanged(Editable s) { 
     this.onTextChanged(target, s); 
    } 

    public abstract void onTextChanged(T target, Editable s); 
} 

이제 청취자를 구현하는 것이 조금 깔끔합니다.EDITTEXT 초점을 때

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) { 
      @Override 
      public void onTextChanged(EditText target, Editable s) { 
       //Do stuff 
      } 
     }); 

는 화재 빈도에 관해서는, 하나는 아마도, 포커스 청취자를 추가하는

2
myTextBox.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) { 

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox); 
    myOutputBox.setText(s); 

    } 
}); 
+2

마지막에 불필요한}} – Howard