Android: Escuchar cambios de variables
He estado buscando un ejemplo de KISS de cómo hacer esto, y mientras que todos parecen (y he pasado por todos ellos!) Bastante simple, todavía no puedo obtener mi cabeza alrededor del concepto. Me refiero a oyentes personalizados (que no se extienden nada) … En particular, la creación de un oyente para una variable booleana para que pueda establecer algunos métodos cuando su valor cambia.
Este es un ejemplo de un ejemplo que he probado: android cómo hacer escucha a una variable personalizada?
- ¿Cómo puedo pasar valores entre un cuadro de diálogo y una actividad?
- Transmisión de parámetros al BroadcastReceiver
- Android: cómo almacenar los valores de las variables en el registro?
- ¿Por qué no se puede resolver android.os.build.VERSION con una variable?
- Guardar variables después de dejar la aplicación?
Si alguien tiene el tiempo para explicar a un oyente personalizado y cómo funciona en inglés, eso sería muy apreciado. Espero que una vez que entienda exactamente cómo el oyente es notificado de un cambio, entonces podré crear mi propio y entender cómo funciona la maldita cosa. Esto me está dando un dolor de cabeza … Gracias de antemano
Aquí es donde estoy en el momento:
public class ChangeListener { boolean boo = false; public ChangeListener(boolean b){ boo = b; } private listener l = null; public interface listener{ public void onChange(boolean b); } public void setChangeListener(listener mListener){ l = mListener; } public void somethingChanged(){ if(l != null){ l.onChange(boo); } } }
Esta es una instantánea de mi actividad principal:
public class Main extends Activity implements ChangeListener.listener{ private ChangeListener listener; private boolean boo = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listener = new ChangeListener(boo); listener.setChangeListener(this); listener.somethingChanged(); } @Override public void onChange(boolean b) { // TODO Auto-generated method stub Toast.makeText(this, "REST = "+b, Toast.LENGTH_SHORT).show(); } }
Ahora, cuando la actividad comienza, el brindis muestra el estado de boo … genial. El problema es que esto sólo ocurre dentro de onCreate, lo que tiene sentido como .somethingChanged se coloca allí. Lo que me gustaría es que el Toast se genere cada vez que boo se cambia de false a true, y true a false independientemente de si dentro de onCreate o no. Es decir:
- Haga clic en un botón
- Hace que boo cambie de falso a verdadero
- El oyente recoge el cambio y ejecuta lo que está en onChange
Sé que podría utilizar el botón actionListener para hacer esto, pero me gustaría estar lejos de esto si es posible, que en el momento estoy empezando a pensar que es imposible.
Cualquier idea sería muy apreciada. ¡Gracias por adelantado!
- Variables de Android en strings.xml
- Cómo guardar variables (Android)
- Variables de getResources (). GetStringArray () de Android
- Cómo configurar el texto introducido en Android Studio 'EditText' a una variable?
- Enviar una variable entre las clases a través de la Intención
- Los identificadores de recursos de Android repentinamente no son definitivos, los campos no se pueden resolver
- Declare una variable global, o declare varias veces en cada clase
- En libgdx en Android, ¿cómo puedo guardar el estado del juego en caso de que se muera la aplicación?
Se ajusta la variable dentro de una clase personalizada de modo que las únicas funciones de acceso también disparen al oyente. Así que la única manera de dar la vuelta al interruptor es a través de las funciones que conmuta y llama al oyente.
public class BooVariable { private boolean boo = false; private ChangeListener listener; public boolean isBoo() { return boo; } public void setBoo(boolean boo) { this.boo = boo; if (listener != null) listener.onChange(); } public ChangeListener getListener() { return listener; } public void setListener(ChangeListener listener) { this.listener = listener; } public interface ChangeListener { void onChange(); } }
Para supervisar el cambio que necesita para implementar BooVariable.ChangeListener y, a continuación, pasar la clase BooVariable una copia de "esto", entonces, cuando se cambia la variable que llama onChange.
Además, teniendo en cuenta que sólo puede en línea el código en lugar de extender directamente:
BooVariable bv = new BooVariable(); bv.setListener(new BooVariable.ChangeListener() { @Override public void onChange() { Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show(); } });
PD. El brindis debe ser llamado desde el hilo de interfaz de usuario, por lo que necesita cambiar el Looper si va a cambiar la variable en un hilo diferente. Esto probablemente no saldrá sin embargo.
Creo que lo que quieres se responde aquí. Esto es lo que usé cuando necesitaba escuchar un valor booleano que se ha cambiado https://stackoverflow.com/a/7157281/2258389
- Cómo rotar vistas sobre el cambio de orientación sin volver a crear el diseño?
- ¿Qué es mejor android.R o personalizado R?