Error de Stackoverflow causado por SeekBar y EditText cambiando uno otro

Así que tengo un SeekBar establecido en conjunción con un EditText del número de tipo de entrada.

Quiero que sea así que si el usuario introduce un número dentro de un rango viable cambiará el progreso de un SeekBar. Además; si el usuario decide que prefiere cambiar arrastrando el SeekBar; que cambiará el EditText al valor actual del SeekBar.

Recibo un stackoverflow intentando implementar esto y creo que es porque tengo a ambos usando sus oyentes onChanged. Así que están causando cambios infinitos entre sí.

Si ese es el caso; ¿cómo iba a lograr mi resultado deseado como se explica?

Código:

s1.setOnSeekArcChangeListener(new SeekArc.OnSeekArcChangeListener() { @Override public void onStopTrackingTouch(SeekArc seekArc) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekArc seekArc) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) { if(progress != Integer.parseInt(et1.getText().toString())) et1.setText(String.valueOf(progress)); // TODO Auto-generated method stub } }); et1.addTextChangedListener(new TextWatcher(){ @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub int i = Integer.parseInt(s.toString()); if(i != Integer.parseInt(et1.getText().toString())) s1.setProgress(i); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); 

Logcat:

  03-18 14:38:59.104: E/AndroidRuntime(2894): FATAL EXCEPTION: main 03-18 14:38:59.104: E/AndroidRuntime(2894): java.lang.StackOverflowError 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.text.DynamicLayout.reflow(DynamicLayout.java:284) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.text.DynamicLayout.<init>(DynamicLayout.java:170) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.makeSingleLayout(TextView.java:5867) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.makeNewLayout(TextView.java:5765) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.checkForRelayout(TextView.java:6304) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3567) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3400) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454) 03-18 14:38:59.104: E/AndroidRuntime(2894): at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.sendAfterTextChanged(TextView.java:7119) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3574) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.TextView.setText(TextView.java:3425) 03-18 14:38:59.104: E/AndroidRuntime(2894): at android.widget.EditText.setText(EditText.java:80 

En onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) tiene una variable fromUser . No establezca texto en su EditText si el usuario no es el que borró su SeekBar / Arc (el texto ya se puede suponer que es correcto, ya que inició la cadena de eventos …)

En su oyente:

 @Override public void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) { if(fromUser && progress != Integer.parseInt(et1.getText().toString())) { et1.setText(String.valueOf(progress)); } } 

En afterTextChanged – antes de establecer el progreso, deshabilite el listener de la barra de búsqueda setOnSeekArcChangeListener (null). y luego agregar el oyente de nuevo.

  @Override public void afterTextChanged(Editable s) { s1.setOnSeekArcChangeListener(null); // TODO Auto-generated method stub int i = Integer.parseInt(s.toString()); if(i>=0 && i<100) s1.setProgress(i); s1.setOnSeekArcChangeListener(mSeekListener); } 

Es normal porque cuando cambia su valor de SeekBar, cambia el valor de EditText en el listener de la barra de búsqueda (et1.setText (String.valueOf (progreso));) para que se escuche a EditText Listener Y cuando cambie el valor de EditText (en el SeekBar oyente), cambia el valor de SeekBar en el Listener de EditText y luego crea un tipo de bucle inifinity.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.