2015-09-04 1 views
0

J'ai besoin d'aide. Je ne sais pas comment je peux faire TextWatcher pour les champs EditText. Je veux faire ceci: si je saisis du texte dans le premier champ, je veux calculer des valeurs pour d'autres champs. Quatre champs sont éditables, donc si je mets de la valeur à un EditText, il change les valeurs dans l'autre et provoque la boucle et Stackoverflowerror.Champs Android EditText et TextWatcher

Il est le code source:

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; 
     } 


    } 

MISE À JOUR

Ok. Je l'ai fait:

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); 
      } 
     }; 

Mais il casue java.lang.IllegalStateException: Impossible de trouver une vraie méthode (View) dans la classe activité com.example.hp.ptcalculator.MainActivity pour gestionnaire onClick sur android vue de classe. widget.EditText avec id 'Pt100TempCEditText' et causée par: java.lang.NoSuchMethodException: true [classe android.view.View]

Répondre

0

pour résoudre ce problème, vous aurez besoin de 4 TextWatcher s - un pour chaque EditText.

Ensuite, dans chaque TextWatcher lorsque vous souhaitez effectuer le calcul, supprimez les TextWatcher de tous les EditText, effectuez vos calculs, puis rajoutez-les.

Cela ressemble à beaucoup de frais généraux, mais il ne devrait pas être perceptible du tout à un utilisateur.

Et oui, vous pouvez supprimer un TextWatcher du TextView et ajoutez-le en cours d'édition, mais vous pouvez supprimer seulement tous les « autres » objet TextWatcher de l'autre objet EditText - plus difficile à mettre en œuvre, mais techniquement correcte (pour gérer les événements rapides correctement) et plus facile à lire (puisque vous n'êtes pas en train d'éditer le EditText actuel - seulement les autres).

Pour utiliser le code de votre question et la réponse:

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); 

REMARQUE: vous devez supprimer des écouteurs pour tout ce qui change. Donc si calc1 ne change pas Pt100Res alors vous n'avez pas besoin de faire les lignes remove/add. Je n'ai pas testé ce code et je l'ai rendu quelque peu générique (ce qui signifie que je n'ai pas essayé de comprendre ce que les fonctions "calc" font réellement.)

+0

Ok. Donc, j'ai besoin d'ajouter TextWatcher au premier EditText, faire des opérations et quand je vais éditer le prochain EditText je devrais enlever le premier observateur et l'ajouter à EditText édité Je comprends, mais pouvez-vous m'aider et pouvez-vous montrer un exemple? –

+0

J'ai édité ma réponse - j'espère que cela vous aidera à expliquer ce que vous devez faire. – Jim