2015-09-04 5 views
0

Мне нужна помощь. Я не знаю, как я могу использовать TextWatcher для полей EditText. Я хочу сделать это: если я ввод текста в первом поле, я хочу рассчитать значения для других полей. Четыре поля редактируются, поэтому, если я поместил значение в один EditText, он изменит значения в других, и это вызовет цикл и Stackoverflowerror.Поля Android EditText и TextWatcher

Это исходный код:

package com.example.hp.ptcalculator; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 

public class Pt100Fragment extends Fragment{ 
    EditText Pt100Res, Pt100TempC, Pt100TempF, Pt100TempK, Pt100Sens, Pt100TolAA, Pt100TolA, Pt100TolB, Pt100TolC; 
    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.pt100form, container, false); 
     Pt100Sens = ((EditText) view.findViewById(R.id.Pt100SensEditText)); 
     Pt100TolAA = ((EditText) view.findViewById(R.id.Pt100TolAAEditText)); 
     Pt100TolA = ((EditText) view.findViewById(R.id.Pt100TolAEditText)); 
     Pt100TolB = ((EditText) view.findViewById(R.id.Pt100TolBEditText)); 
     Pt100TolC = ((EditText) view.findViewById(R.id.Pt100TolCEditText)); 
     Pt100Res = ((EditText) view.findViewById(R.id.Pt100ResEditText)); 
     Pt100TempC = ((EditText) view.findViewById(R.id.Pt100TempCEditText)); 
     Pt100TempF = ((EditText) view.findViewById(R.id.Pt100TempFEditText)); 
     Pt100TempK = ((EditText) view.findViewById(R.id.Pt100TempKEditText)); 
     Pt100Res.addTextChangedListener(watcher); 
     Pt100TempC.addTextChangedListener(watcher); 


     return view; 
    } 


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

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 




     public void calc1() { 
      double R; 
      double TC, TF, TK, Sens, TolAA, TolA, TolB, TolC; 
      String tmp = Pt100Res.getText().toString(); 
      if (tmp.equals("")) 
       R = 0; 
      else 
       R = Double.parseDouble(tmp); 
      TC = res2temp(R); 
      TF = 9 * TC/5 + 32; 
      TK = TC + 273.15; 
      Sens = 0.2/(res2temp(R * 1 + 0.1) - res2temp(R * 1 - 0.1)); 
      TolAA = 0.1 + 0.0017 * Math.abs(TC); 
      TolA = 0.15 + 0.002 * Math.abs(TC); 
      TolB = 0.30 + 0.005 * Math.abs(TC); 
      TolC = 0.60 + 0.01 * Math.abs(TC); 
      Pt100TempC.setText(String.valueOf(TC)); 
      Pt100TempF.setText(String.valueOf(TF)); 
      Pt100TempK.setText(String.valueOf(TK)); 
      Pt100Sens.setText(String.valueOf(Sens)); 
      Pt100TolAA.setText(String.valueOf(TolAA)); 
      Pt100TolA.setText(String.valueOf(TolA)); 
      Pt100TolB.setText(String.valueOf(TolB)); 
      Pt100TolC.setText(String.valueOf(TolC)); 
     } 

     public void calc2() { 
      double TC, TF, TK, Sens, TolAA, TolA, TolB, TolC, R; 
      String tmp = Pt100TempC.getText().toString(); 
      if (tmp.equals("")) 
       TC = 0; 
      else 
       TC = Double.parseDouble(tmp); 
      R = temp2res(TC); 
      TF = 9 * TC/5 + 32; 
      TK = TC + 273.15; 
      Sens = 0.2/(res2temp(R + 0.1) - res2temp(R - 0.1)); 
      TolAA = 0.1 + 0.0017 * Math.abs(TC); 
      TolA = 0.15 + 0.002 * Math.abs(TC); 
      TolB = 0.30 + 0.005 * Math.abs(TC); 
      TolC = 0.60 + 0.01 * Math.abs(TC); 
      Pt100Res.setText(String.valueOf(R)); 
      Pt100TempF.setText(String.valueOf(TF)); 
      Pt100TempK.setText(String.valueOf(TK)); 
      Pt100Sens.setText(String.valueOf(Sens)); 
      Pt100TolAA.setText(String.valueOf(TolAA)); 
      Pt100TolA.setText(String.valueOf(TolA)); 
      Pt100TolB.setText(String.valueOf(TolB)); 
      Pt100TolC.setText(String.valueOf(TolC)); 
     } 

     public double temp2res(double temp) { 
      double res; 
      double coef_a = 3.90830e-3; 
      double coef_b = -5.77500e-7; 
      double coef_c = -4.18301e-12; 
      double r0 = 100; 
      if (temp > 0) { 
       res = r0 * (1 + coef_a * temp + coef_b * Math.pow(temp, 2)); 
      } else if (temp < 0) { 
       res = r0 * (1 + coef_a * temp + coef_b * Math.pow(temp, 2) + coef_c * (Math.pow(temp, 4) - 100 * Math.pow(temp, 3))); 
      } else res = r0; 
      return res; 
     } 

     public double res2temp(double res) { 
      double coef_a = 3.90830e-3; 
      double coef_b = -5.77500e-7; 
      double coef_c = -4.18301e-12; 
      double r0 = 100; 
      double t, t0, Ohm2Temp; 
      if (res < r0) { 
       double pente = 0.38; 
       double epsilon = 0.000000000001; 
       int MaxIter = 100; 
       t0 = -(r0 - res)/pente; 
       for (int i = 1; i < MaxIter; i++) { 
        t = t0 - CVD(t0, res, r0)/CVDprime(t0, r0); 
        if (Math.abs(t - t0) <= epsilon) { 
         Ohm2Temp = t; 
         return Ohm2Temp; 
        } else t0 = t; 
       } 
       Ohm2Temp = 9999999; 
      } else 
       Ohm2Temp = (-coef_a + Math.sqrt(Math.pow(coef_a, 2) - 4 * coef_b * (1 - res/r0)))/(2 * coef_b); 

      return Ohm2Temp; 
     } 

     public double CVD(double t, double Rt, double r0) { 
      double coef_a = 3.90830e-3; 
      double coef_b = -5.77500e-7; 
      double coef_c = -4.18301e-12; 
      double ff = r0 * (1 + coef_a * t + coef_b * Math.pow(t, 2) + coef_c * (t - 100) * Math.pow(t, 3)) - Rt; 
      return ff; 
     } 

     public double CVDprime(double t, double R0) { 
      double coef_a = 3.90830e-3; 
      double coef_b = -5.77500e-7; 
      double coef_c = -4.18301e-12; 
      double fp = R0 * (coef_a + 2 * coef_b * t - 300 * coef_c * Math.pow(t, 2) + 4 * coef_c * Math.pow(t, 3)); 
      return fp; 
     } 


    } 

UPDATE

Ok. Я сделал это:

TextWatcher watcher1 = new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       calc1(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       Pt100TempC.removeTextChangedListener(watcher2); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       Pt100TempC.addTextChangedListener(watcher2); 
      } 
     }; 
     TextWatcher watcher2 = new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       calc2(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       Pt100Res.removeTextChangedListener(watcher1); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       Pt100Res.addTextChangedListener(watcher1); 
      } 
     }; 

Но АНОМАЛЬНОЙ java.lang.IllegalStateException: Не удалось найти метод верно (View) в деятельности класса com.example.hp.ptcalculator.MainActivity для OnClick обработчика на вид класса андроида. widget.EditText с идентификатором 'Pt100TempCEditText' и Вызванный: java.lang.NoSuchMethodException: истинный [класс android.view.View]

ответ

0

Чтобы решить эту проблему, вам понадобится 4 TextWatcher S - по одному для каждого EditText.

Затем в каждом TextWatcher, если вы хотите выполнить расчет, удалите TextWatcher s со всех EditText s, выполните ваши вычисления и затем добавьте их обратно.

Это звучит как много накладных расходов, но это не должно быть заметно для пользователя.

И да, вы можете удалить TextWatcher из редактируемой TextView и добавить его обратно, но вы можете только удалить все «другие» TextWatcher объект из другого EditText объекта - сложнее реализовать, но технически правильно (правильно обрабатывать быстрые события) и легче читать (поскольку вы не редактируете текущий EditText - только другие).

Чтобы использовать код из вашего вопроса и ответа:

EditText Pt100Res = ((EditText) view.findViewById(R.id.Pt100ResEditText)); 
EditText Pt100TempC = ((EditText) view.findViewById(R.id.Pt100TempCEditText)); 
EditText Pt100TempF = ((EditText) view.findViewById(R.id.Pt100TempFEditText)); 
EditText Pt100TempK = ((EditText) view.findViewById(R.id.Pt100TempKEditText)); 
TextWatcher watcherRes; 
TextWatcher watcherC; 
TextWatcher watcherF; 
TextWatcher watcherK; 
watcherRes = new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      Pt100TempRes.removeTextChangedListener(watcherRes); 
      Pt100TempC.removeTextChangedListener(watcherC); 
      Pt100TempF.removeTextChangedListener(watcherF); 
      Pt100TempK.removeTextChangedListener(watcherK); 
      calc1(); 
      Pt100TempRes.addTextChangedListener(watcherRes); 
      Pt100TempC.addTextChangedListener(watcherC); 
      Pt100TempF.addTextChangedListener(watcherF); 
      Pt100TempK.addTextChangedListener(watcherK); 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 
    watcherC = new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      Pt100TempRes.removeTextChangedListener(watcherRes); 
      Pt100TempC.removeTextChangedListener(watcher); 
      Pt100TempF.removeTextChangedListener(watcherF); 
      Pt100TempK.removeTextChangedListener(watcherK); 
      calc2(); 
      Pt100TempRes.addTextChangedListener(watcherRes); 
      Pt100TempC.addTextChangedListener(watcherC); 
      Pt100TempF.addTextChangedListener(watcherF); 
      Pt100TempK.addTextChangedListener(watcherK); 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 
    watcherF = new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      Pt100TempRes.removeTextChangedListener(watcherRes); 
      Pt100TempC.removeTextChangedListener(watcher); 
      Pt100TempF.removeTextChangedListener(watcherF); 
      Pt100TempK.removeTextChangedListener(watcherK); 
      calc2(); 
      Pt100TempRes.addTextChangedListener(watcherRes); 
      Pt100TempC.addTextChangedListener(watcherC); 
      Pt100TempF.addTextChangedListener(watcherF); 
      Pt100TempK.addTextChangedListener(watcherK); 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 
    watcherK = new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      Pt100TempRes.removeTextChangedListener(watcherRes); 
      Pt100TempC.removeTextChangedListener(watcher); 
      Pt100TempF.removeTextChangedListener(watcherF); 
      Pt100TempK.removeTextChangedListener(watcherK); 
      calc2(); 
      Pt100TempRes.addTextChangedListener(watcherRes); 
      Pt100TempC.addTextChangedListener(watcherC); 
      Pt100TempF.addTextChangedListener(watcherF); 
      Pt100TempK.addTextChangedListener(watcherK); 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 

    Pt100Res.addTextChangedListener(watcherRes); 
    Pt100TempC.addTextChangedListener(watcherC); 
    Pt100TempF.addTextChangedListener(watcherF); 
    Pt100TempK.addTextChangedListener(watcherK); 

ПРИМЕЧАНИЕ: Вы должны удалить слушателей за все, что меняется. Поэтому, если calc1 не изменяет Pt100Res, тогда вам не нужно делать линии удаления/добавления. Я не тестировал этот код, и я сделал его несколько обобщенным (это означает, что я не пытался понять, что на самом деле выполняют функции «calc».

+0

Итак, мне нужно добавить TextWatcher в первый EditText, выполнить операции и когда я отредактирую следующий EditText, я должен удалить первый наблюдатель и добавить в отредактированный EditText. Я понимаю, но можете ли вы мне помочь, и можете ли вы показать пример? –

+0

Я отредактировал свой ответ - надеюсь, это поможет объяснить, что вам нужно сделать. – Jim