2013-01-22 16 views
14

Szukałem przykładu KISS, jak to zrobić, i choć wszystkie wydają się (i przeszedłem przez nich WSZYSTKO!) Wystarczająco proste, wciąż nie mogę się pogubić Koncepcja. Odnoszę się do niestandardowych detektorów (takich, które niczego nie rozszerzają) ... W szczególności, tworzenie detektora dla zmiennej boolowskiej, tak, że mogę ustawić niektóre metody, gdy zmienia się jej wartość.Android: Słuchanie zmian zmiennych

ten jest przykładem przykład Próbowałem: android how to make listener to a custom variable?

Jeśli ktoś ma czas, aby wyjaśnić niestandardową słuchacza i jak to działa w prostym języku angielskim, które byłyby mile widziane. Mam nadzieję, że kiedy zrozumiem dokładnie, jak słuchacz zostanie powiadomiony o zmianie, będę mógł stworzyć własne i zrozumieć, jak to cholerstwo działa. To daje mi ból głowy ... Dzięki z góry

Oto gdzie jestem w tej chwili:

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


} 

Jest to obraz mojej głównej działalności:

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


} 

Teraz, gdy zaczyna się aktywność, Toast wyświetla stan boo ... świetny. Problem polega na tym, że dzieje się tak tylko w onCreate, co ma sens, ponieważ jest tam umieszczone coś. Chciałbym, żeby toast był generowany za każdym razem, gdy boo zmienia się z fałszu na prawdziwe, a prawda na fałsz, niezależnie od tego, czy jest to w środku naCreate czy nie. Tj:

  • Kliknij przycisk
  • Przyczyny boo zmienić z false na true
  • Listener odbiera na zmianę i działa, co jest w onChange

wiem, może po prostu użyć Aby to zrobić, należy wykonać akcję, ale chciałbym trzymać się z dala od tego, jeśli to możliwe, co w tej chwili zaczynam myśleć, że jest niemożliwe.

Każdy wgląd byłby mile widziany. Z góry dziękuję!

+0

Rozważam użycie prostych metod setX/getX do zmiany wartości i przesunięcia innych metod.Prawdopodobnie będzie to wystarczające, ale wciąż uważam, że moje pierwotne żądanie ma dużą wartość, jeśli jest to możliwe w Javie. Komentarze/rozwiązania wciąż doceniane. Dzięki – user1977217

Odpowiedz

3

Myślę, że to, co chcesz, jest tu odpowiedziana. Właśnie tego użyłem, gdy potrzebowałem nasłuchiwać wartości boolowskiej, która została zmieniona. https://stackoverflow.com/a/7157281/2258389

+0

Dodaj odpowiednie cytaty do swojego postu –

14

Zawijam zmienną wewnątrz niestandardowej klasy, tak że tylko funkcje dostępu również wyzwalają słuchacza. Tak więc jedynym sposobem przełączenia przełącznika są funkcje, które przełączają i wywołują słuchacza.

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

Aby monitorować zmiany należy wdrożyć BooVariable.ChangeListener a następnie przekazać BooVariable klasa kopię „ten”, a następnie, po zmianie zmiennej wywołuje onChange.

Ponadto, mając na uwadze można po prostu wbudować kod zamiast rozciągać się bezpośrednio:

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

PS. Toast musi zostać wywołany z wątku UI, więc musisz zmienić Looper, jeśli zamierzasz zmienić zmienną w innym wątku. To prawdopodobnie nie wyjdzie.

Powiązane problemy