2013-01-22 16 views
14

Ho cercato un esempio di KISS su come eseguire questa operazione, e mentre tutti sembrano (e li ho esaminati TUTTI!) Abbastanza semplici, non riesco ancora a capirlo il concetto. Mi riferisco ai listener personalizzati (quelli che non estendono nulla) ... In particolare, creando un listener per una variabile booleana in modo che possa impostare alcuni metodi quando il suo valore cambia.Android: ascolto delle modifiche variabili

questo è un esempio di un esempio che ho provato: android how to make listener to a custom variable?

Se qualcuno ha il tempo di spiegare un ascoltatore personalizzato e come funziona in parole povere, che sarebbe molto apprezzato. Spero che una volta capito esattamente come viene notificato all'ascoltatore un cambiamento, allora sarò in grado di crearne uno e capire come funziona quella dannata cosa. Questo mi sta dando un mal di testa ... Grazie in anticipo

Ecco dove sono a in questo 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); 
     } 
    } 


} 

Questa è una fotografia di mia attività 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(); 
    } 


} 

Ora, quando l'attività inizia, il Toast mostra lo stato di boo ... fantastico. Il problema è che si verifica solo all'interno di onCreate, il che ha senso quando si trova .qualcosaChanged. Quello che vorrei è che il Toast sia generato ogni volta che boo viene cambiato da falso a vero, e vero a falso, indipendentemente dal fatto che sia all'interno di onCreate o meno. Vale a dire:

  • Fare clic su un pulsante di
  • cause fischiano cambiare da false a true
  • Listener raccoglie sul cambiamento e corre tutto ciò che è in onChange

So che potrei semplicemente usare il button actionListener per fare questo, ma mi piacerebbe stare lontano da questo, se possibile, che al momento sto iniziando a pensare è impossibile.

Qualsiasi intuizione sarebbe molto apprezzata. Grazie in anticipo!

+0

Sto considerando l'utilizzo di semplici metodi setX/getX per modificare il valore e impostare altri metodi.Questo sarà probabilmente sufficiente ma continuo a pensare che la mia richiesta originale abbia molto valore se è possibile farlo in Java. Commenti/soluzioni ancora apprezzate. Grazie – user1977217

risposta

3

Penso che quello che vuoi sia una risposta qui. Questo è quello che ho usato quando avevo bisogno di ascoltare per un valore booleano che è stato modificato https://stackoverflow.com/a/7157281/2258389

+0

Si prega di aggiungere le citazioni pertinenti al tuo post –

14

Si avvolge la variabile all'interno di una classe personalizzata in modo che le uniche funzioni di accesso incastrino anche l'ascoltatore. In modo che l'unico modo per capovolgere l'interruttore è tramite le funzioni che alterna e chiama l'ascoltatore.

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

Per monitorare il cambiamento è necessario implementare BooVariable.ChangeListener e quindi passare alla classe BooVariable una copia di "questo", quindi, quando si cambia la variabile si chiama onChange.

Inoltre, tenendo presente che si può semplicemente il codice inline invece di estendere direttamente:

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

PS. Il brindisi deve essere chiamato dal thread dell'interfaccia utente, quindi è necessario cambiare il Looper se si vuole cambiare la variabile in un thread diverso. Questo probabilmente non si presenterà comunque.

Problemi correlati