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.
- Recursivo + 900 elementos + chequeo de vecinos = causas stackoverflow
- Android stackoverflow utilizando while loop
- Java.lang.StackOverflowError
- Android StackOverflowError en ViewGroup.resetResolvedTextDirection
- Android: Aumentar el tamaño de la pila de llamadas
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
- Android: GreenDroid-GoogleAPIs falla con StackOverflow Excepción durante la importación
- Android (en Scala): StackOverflowError depende de cuándo iniciar un hilo?
- Stackoverflow en Android 2.3.3 Sólo dispositivos
- Android StackOverflowError en ViewGroup.resetResolvedTextDirection al agregar ListView a LinearLayout
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.