Как добавить TextWatchers в несколько EditTexts

Я просмотрел некоторые другие вопросы и сообщения, но я не могу понять это... Я создаю приложение для преобразования, я могу автоматически заполнять футы и ярды, вставляя дюймы, используя addTextChangedListener, но я не могу понять, как добавить TextChangedListener в другие поля, чтобы я мог вводить футы и автоматически преобразовывать в дюймы и ярды, а ярды в дюймы и футы...

   @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) { }

person raygedstad    schedule 30.03.2014    source источник
comment
Я в замешательстве... Вы уже добавили TextChangedListener. Что мешает добавить еще два?   -  person gatlingxyz    schedule 31.03.2014
comment
Вы буквально уже сделали это один раз в коде, который вы разместили. Буквально.   -  person gatlingxyz    schedule 31.03.2014


Ответы (2)


эй, так как вы просили разные способы... я придумал способ использовать 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, который для каждого сохраненного текстового наблюдателя вызывает вызов forceValidate();

person j2emanue    schedule 10.05.2014

person    schedule
comment
Я, наконец, получил это, я не смог использовать вышеуказанный метод, в итоге я добавил 3 отдельных addTextChangedListeners с if & hasFocus, если есть более простой способ, я бы хотел научиться! Спасибо за помощь, ребята! - person raygedstad; 31.03.2014