2013-01-22 22 views
14

Bunun nasıl yapılacağına dair bir KISS örneği aradım ve hepsi göründükleri halde (ve hepsinden geçtim TÜM!) Yeterince basit, hala başımı alamıyorum kavram. Özel dinleyicilere atıfta bulunuyorum (herhangi bir şeyi genişletmeyenler). Özellikle, bir boole değişkeni için bir dinleyici oluşturarak, değeri değiştiğinde bazı yöntemleri ayarlayabilirim.Android: Değişken değişiklikleri dinleme

bu ben denedim bir örnek örneğidir: android how to make listener to a custom variable?

birisi özel bir dinleyici açıklamak için zaman vardır ve düz İngilizce olarak nasıl çalıştığını, o çok takdir edin. Dinleyicinin bir değişiklikten nasıl haberdar edildiğini anladığımda, kendi kendimi yaratabileceğimi ve lanet şeyin nasıl çalıştığını anlayabileceğimi umuyorum.

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


} 

:

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


} 

Bu benim ana faaliyet anlık bir: Bu şu anda yaşıyorum nerede

İşte

olduğunu önceden ... Bana Teşekkür ağrıtıyor Şimdi, etkinlik başladığında, Tost, harikulade durumunu gösterir. Problem sadece onCreate içinde gerçekleşir, bu da .somethingChanged'in olduğu gibi mantıklıdır. İstediğim şey, Toast'ın, her defasında yaratığın, sahte olandan doğruya doğru değiştiği ve ondan sonra yaratılıp yaratılmadığına bakılmaksızın, sahte olarak doğru olarak üretilmesidir. Yani:

  • nedenleri gerçek
  • İşleyici yanlıştan değiştirmek için boo bir düğmeyi tıklayın değişikliği alır ve ben sadece kullanabilirsiniz biliyorum onChange

ne varsa çalıştırır button actionListener bunu yapmak için, ancak mümkün olduğunca uzak durmak isterim ki, şu anda düşünmeye başlamak imkansızdır.

Herhangi bir fikir çok takdir edilecektir. Şimdiden teşekkürler!

+0

Değeri değiştirmek ve diğer yöntemleri değiştirmek için basit setX/getX yöntemlerini kullanmayı düşünüyorum.Bu muhtemelen yeterli olacaktır ama yine de orijinal isteğimin Java'da yapılabilmesi mümkün olduğunda çok fazla değeri olduğunu düşünüyorum. Yorumlar/çözümler hala takdir edilmektedir. Teşekkürler – user1977217

cevap

14

Değiştirilen bir Boolean değerini dinlemem gerektiğinde kullandığım şey, tek bir erişim işlevinin yalnızca dinleyici işlevini de tetikleyeceği şekilde özel bir sınıf içinde sarmanızdır. Bu yüzden, anahtarı çevirmenin tek yolu, dinleyiciyi değiştiren ve çağıran işlevlerdir.

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

Eğer BooVariable.ChangeListener uygulamak ve daha sonra BooVariable sınıf değişkeni siz değiştirdiğinizde "Bu" o zaman, Değiştiğinde çağırır bir kopyasını geçmesi gerekiyor değişikliği izlemek için.

Ayrıca göz önünde tutarak sadece kodu satır içine alabilirsiniz ziyade doğrudan uzatmak:

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

PS. Tost, UI iş parçacığından çağrılmalıdır, bu nedenle değişkeni farklı bir iş parçacığında değiştirecekseniz, Looper'ı değiştirmeniz gerekir. Bu muhtemelen gelmeyecek.

İlgili konular