2014-03-30 25 views
0

我看了一些其他問題和帖子,但我似乎無法弄清楚這一點......我正在構建一個轉換應用程序,我可以自動填充腳和碼通過把在英寸,採用addTextChangedListener,但我不能弄清楚如何addTextChangedListener到其他領域,這樣我可以進入腳,並自動轉換爲英寸和碼,碼到英寸和英尺...如何添加TextWatchers到多個EditTexts

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final EditText editIn = (EditText) findViewById(R.id.editIn); 
     final EditText editFt = (EditText) findViewById(R.id.editFt); 
     final EditText editYd = (EditText) findViewById(R.id.editYd); 

     editIn.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } 
      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
       try { 
        double in = Double.valueOf(editIn.getText().toString()); 
        double ft = in/12; 
        double yd = in/36; 
        editFt.setText(String.valueOf(ft)); 
        editYd.setText(String.valueOf(yd)); 
       } catch (NumberFormatException e) { 
        e.printStackTrace(); 
       } 
      } 
      @Override 
      public void afterTextChanged(Editable editable) { } 
+0

我很困惑...你已經添加了'TextChangedListener'。什麼阻止你添加兩個? – kentarosu

+0

我不知道如何 – raygedstad

+0

你已經在你發佈的代碼中完成了一次。從字面上看。 – kentarosu

回答

1
TextWatcher watcher = new TextWatcher() { 

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

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

     @Override 
     public void afterTextChanged(Editable s) { 

       //YOUR CODE 
     } 
    }; 

    editIn.addTextChangedListener(watcher); 
    editFt.addTextChangedListener(watcher); 
    editYd.addTextChangedListener(watcher); 
+0

如果我嘗試添加更多偵聽器,我仍然沒有遵循程序崩潰... – raygedstad

+0

我終於明白了,我無法使用上面的方法,我最終添加了3個單獨的addTextChangedListeners,並添加了if&hasFocus,如果有更簡單的方法,我很樂意學習!謝謝你們的幫助! – raygedstad

0

嘿,因爲你問了不同的方式....我想出了一種方法來使用textwatcher來驗證不同的領域,每個領域可以有自己的驗證。

/* A TextWatcher which can be reused anonymously only. 
* 
*/ 
public abstract class MyTextWatcher implements TextWatcher { 

    private TextView view; 


    // view represents the view you want to watch. Should inherit from 
    // TextView 
    private MyTextWatcher(View view) { 

     if (view instanceof TextView){ 
      this.view = (TextView) view; 
     } 
     else 
      throw new ClassCastException(
        "view must be an instance Of TextView"); 
    } 

    /** 
    * 
    * @param view - the textview to validate 
    * override this to handle any textview validations and UI error handling 
    */ 

    public abstract void validate(TextView view); 



    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     validate(); //this calls all the different views validate() methods 

    } 

    @Override 
    public void afterTextChanged(Editable editable) {   
    } 

    public void forceValidation(){ 
     validate(view); 

    } 

    public void markAsErrorField(){ 
     if(isEmptyField()){ 

      view.setHintTextColor(getResources().getColorStateList(R.color.red)); 

     } 
    } 

    //resets textviews to default appearance 
    public void markAsDefault(){ 
      view.setHintTextColor(getResources().getColorStateList(R.color.default)); 
    } 


    public boolean isEmptyField() { 
     return view.getText().toString().trim().equals(""); 
    } 

} 

之後,我可以使用上面的匿名設置我想運行的不同驗證方法。在上面的,我有markAsDefault和markAsErrorField方法...繼承人如何應用它們:

et1.addTextChangedListener(new MyTextWatcher(et1){ 
     @Override 
     public void validate(TextView view) { 

      markAsErrorField(); 
     } 
    }); 

et2.addTextChangedListener(new MyTextWatcher(et2){ 
      @Override 
      public void validate(TextView view) { 

       markAsDefault(); 
      } 
     }); 

作爲一個額外的:如果你想使用forceValidate方法然後使用外部類和textwatcher構造保存靜態數組列表每個實例。然後有for循環,爲每個textwatcher存儲調用forceValidate();