Birçok düğme için OnClickListener arabirimini uygulamanın uygun yolu nedir


10

Android Etkinliğim, hepsi bir OnClickListener'a ihtiyaç duyan birden fazla düğme içeriyor. Bunun gibi birçok farklı yol gördüm ::

  • Arabirimi aktivite sınıfında uygulama
  • Arayüzü uygulayan ayrı bir sınıf oluşturma
  • Her düğme için anonim bir iç sınıf tanımlama.

Her yaklaşımın birçok örneğini gördüm. Ancak, bana neden bir yaklaşımın diğeri yerine kullanılacağı açık değil. Bu yaklaşımlar arasındaki farklar üslup mu yoksa bir yaklaşımı daha iyi yapan nedenler var mı?

Yanıtlar:


6

Birçok şeyde olduğu gibi, doğru yaklaşım, belirli bir düğme için ne yapmaya çalıştığınıza ve etkinlikle başka ne yaptığınıza bağlıdır.

Etkinlik sınıfı arabirimi uygular :
Bu dinleyici çağrıldığında yürütülecek yalnızca bir tür göreviniz olduğunda bu iyi bir seçenektir. Buna bir örnek, birkaç alan ve kaydet düğmesi içeren basit bir form olabilir. Gerçekte ne yapılması gerektiğine karar vermek için olay dinleyicimin olayın kaynağını kontrol etmemeyi tercih ederim. Bazıları bu tarzı bir şey olduğunu söyleyebiliriz biliyorum, ama dinleyici bu kontrolü yapmak için gerek kalmadan tam olarak her olay için ne denir bilecek gibi kodu takip etmek kolaylaştırır inanıyorum.

Farklı bir sınıf arabirimi uygular :
Yukarıda söylediğim gibi, aynı olayı tetikleyebilecek birden fazla öğem olduğunda bu seçeneği tercih ederim. Yukarıdaki örneği genişleterek, bir tıklama dinleyici gerektiren net bir düğme ekleyelim. Kaydetme eylemlerini önceden yapan ve net eylemleri önceden oluşturan bir dinleyici oluşturun. Her dinleyici yalnızca bu eylemi üretecek bileşenlere eklenir.

Bu uygulamanın, eğer önemsiyorsanız kullanabileceğiniz ek bir yararı vardır. Bunun yararı, diğer sınıfların etkinlik sınıfınızın içindeki olayı tetiklemesini engellemesidir. Arabirim yöntemi herkese açık olması gerektiğinden, sınıfa başvuru yapan herkes etkinliği tetikleyebilir. Uygulamada kimin ne yapabileceği üzerinde hassas bir kontrol istiyorsanız, ayrı bir sınıf, etkinliğe referansı olan herkesin formunuzun temizlenmesini veya kaydedilmesini tetiklemesini önler (veya dinleyici kaynağı kullanıyorsa kodu kırabilir, ancak hatalı giriş işlemez).

Anonim bir iç sınıf arabirimi uygular :
Bu, gerçekte uygulama olarak farklı bir sınıf kullanmanın ikinci seçeneğini oluşturmanın özel bir yoludur. Kimse sınıfın bir örneğini oluşturamadığından, bu seçenek olayı kimin tetikleyebileceğini de kısıtlayabilir. Ancak, iki seçenek arasındaki en önemli etken ne kadar iş yapıldığını düşünüyorum. Birkaç metin alanını temizlemek basit ve basit bir işlemdir. Bununla birlikte, for'un kaydedilmesi işlemi, bir dizi görevi içerebilir, girdiyi doğrularsınız (yapmanız gereken), değerleri saklamak için bir veritabanına yazmanız ve bazı kaydetme işlemlerini tetiklemenizdir. Bu durumda, kendi dosyasıyla ayrı bir sınıf oluşturmak, giriş formu ve veri işleme arasında daha net bir ayrım sağlayacaktır. Bu da, içinde birden çok iç sınıf bulunan daha büyük bir dosya yerine form kodunu korur.


Vay, cevabın için teşekkürler. Genel gider açısından, birden fazla dinleyici sınıfı oluşturmak daha maliyetli midir?
slayton

@slayton: Ne yaparsanız yapın daima maliyetler olacaktır. Soru "Fark sizin için önemli mi?" Olmalıdır. Daha fazla nesne yapma ağırlığı vardır, ancak dinleyicinizin gerçekten ne yapacağına karar vermek için bir kaynak listesinden geçmesi gerekiyorsa yürütme süresi daha uzun olacaktır. Bellek kullanımı ve performansı sizin için önemliyse, kodu profillendirmeli ve gereksinimlerinize göre en iyi olana karar vermelisiniz. Ancak, bunun kodunuzun şişe boynu olacağından şüpheliyim. Aksi gösterilinceye kadar, kararlarınızı kodu daha net ve daha düzenli hale getirin.
hohossler

3

Dördüncü yol, onClick özniteliğini mizanpajda ayarlamaktır:

<Button android:onClick="clickHandlerForButtonX" />

Faaliyette bu karşılık gelen yönteme sahip olan:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

ilginç, bunu yapabileceğinizin farkında değildim. Bu, düğme tıklamaları ile başa çıkmak için Android'e özgü bir mekanizma gibi görünse de.
slayton

Ben genellikle "Etkinlik sınıfı uygular arabirimi" ile gider - bu şekilde, tüm tıklama ile ilgili şeyler aynı yerde var.
orjan

bu özel yöntem parçalarla çalışmaz.
Rahul Tiwari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.