web-dev-qa-db-fra.com

Android: à l'écoute des changements de variables

Je cherchais un KISS exemple de comment faire, et bien qu'ils semblent tous (et je les ai tous passés!) Assez simples, je n'arrive toujours pas à comprendre Je fais référence aux écouteurs personnalisés (ceux qui ne s'étendent pas) ... En particulier, la création d'un écouteur pour une variable booléenne afin que je puisse déclencher certaines méthodes lorsque sa valeur change.

ceci est un exemple d'un exemple que j'ai essayé: Android comment faire écouter à une variable personnalisée?

Si quelqu'un a le temps d'expliquer un auditeur personnalisé et comment il fonctionne en anglais simple, ce serait très apprécié. J'espère qu'une fois que je comprendrai exactement comment l'auditeur est informé d'un changement, je serai en mesure de créer le mien et de comprendre comment cette putain de chose fonctionne. Cela me donne mal à la tête ... Merci d'avance

Voici où j'en suis en ce moment:

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


}

Voici un aperçu de mon activité principale:

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


}

Maintenant, lorsque l'activité commence, le Toast affiche l'état de boo ... super. Le problème est que cela ne se produit que dans onCreate, ce qui est logique lorsque .somethingChanged y est placé. Ce que j'aimerais, c'est que le Toast soit généré à chaque fois que boo passe de faux à vrai, et vrai à faux, que ce soit dans onCreate ou non. C'est à dire:

  • Cliquez sur un bouton
  • Boo passe de faux à vrai
  • L'écouteur reprend le changement et exécute tout ce qui se trouve dans onChange

Je sais que je pourrais simplement utiliser le bouton actionListener pour le faire, mais je voudrais rester à l'écart de cela si possible, ce qui pour le moment je commence à penser que c'est impossible.

Toute opinion serait très appréciée. Merci d'avance!

22
user1977217

Vous enveloppez la variable dans une classe personnalisée de sorte que les seules fonctions d'accès déclenchent également l'écouteur. Pour que le seul moyen de basculer le commutateur soit via les fonctions qui basculent et appellent l'auditeur.

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

Pour surveiller la modification, vous devez implémenter BooVariable.ChangeListener, puis transmettre à la classe BooVariable une copie de "this" puis, lorsque vous modifiez la variable qu'elle appelle onChange.

En outre, en gardant à l'esprit que vous pouvez simplement incorporer le code plutôt que de l'étendre directement:

BooVariable bv = new BooVariable();
bv.setListener(new BooVariable.ChangeListener() {
    @Override
    public void onChange() {
        Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show();
     }
});

PS. Le toast doit être appelé à partir du thread d'interface utilisateur, vous devez donc changer le Looper si vous souhaitez modifier la variable dans un thread différent. Cela n'arrivera probablement pas cependant.

26
Tatarize

Je pense que ce que vous voulez est répondu ici. C'est ce que j'ai utilisé lorsque j'avais besoin d'écouter une valeur booléenne qui a été modifiée https://stackoverflow.com/a/7157281/2258389

3
Jason