Android onClick in XML ve OnClickListener karşılaştırması


87

Daha önce benzer şekilde yazılmış bir sorunun sorulduğunu fark ettim ama bu farklı. Android uygulamaları geliştirme konusunda oldukça yeniyim ve android:onclick=""XML özelliği ile setOnClickListeneryöntem arasındaki fark (lar) ile ilgili üç sorum var .

  1. İkisi arasındaki farklar nelerdir? Derleme zamanında veya çalışma zamanında bulunan iki uygulama arasındaki fark mı yoksa her ikisi birden mi?

  2. Hangi kullanım durumları hangi uygulama için uygundur?

  3. Android'de parçaların kullanılması, uygulama seçiminde ne gibi farklar yaratır?


2
# 2 için: onclickHer sınıfın bu yöntemi uyguladığından emin olmanız gerektiğinden , xml'yi kullanırken dikkatli olmalısınız . Bu, düzeni birden çok kez kullandığınızı varsayar. Ancak, yöntemin onu uygulayan tüm sınıflarda olmasını sağlamak için bir java arayüzüne sahip olsaydınız, endişelenmenize gerek kalmazdı.
Uxonith

Açıkladığınız gibi bir java arayüzüne sahip olmak, OnClickListener'ı genişletmek veya uygulamakla hemen hemen aynı olmaz mıydı?
KG6ZVP

Bunu daha önce inceledim ve sanırım tercihten biraz daha fazlası var, ama üzgünüm, bir süredir daha fazlasını söyleyemem. Uygun olduğu android:onclickzamanları seviyorum , ancak bazen sorunlara neden olduğunu biliyorum ve bunları da hatırlayamıyorum :)
Uxonith

xml onClick dinamik API düzeyinde 19 şişirilmiş iç içe düzen elemanları değil çalışır
Amit Kaushik'in

1
Android: onClick kullanan diğer insanlardan gelen kodu nadiren gördüm ve başka birinin koduna baktığınızda en kafa karıştırıcı olanıdır. SetOnClickListener'ın tüm olanaklarına sahip olmadığından, neredeyse herkes benim görüşüme göre sadece setOnClickListener kullanıyor
Christian

Yanıtlar:


124

OnClickListener ile OnClick Arasındaki Fark:

  • OnClickListener, uygulamanız gereken arayüzdür ve java kodunda bir görünüme ayarlanabilir.
  • OnClickListener, birinin gerçekten tıklamasını bekleyen şeydir; onclick, biri tıkladığında ne olacağını belirler.
  • Son zamanlarda android, android: onclick adlı görünümlere herhangi bir arayüz uygulamaya gerek kalmadan doğrudan görünümün etkinliğindeki tıklamaları işlemek için kullanılabilen bir xml özelliği ekledi.
  • Gerekirse bir dinleyici uygulamasını diğeriyle kolayca değiştirebilirsiniz.
  • Bir OnClickListener, click olayının eylemini / davranışını olayı tetikleyen Görünümden ayırmanıza olanak tanır. Basit durumlar için bu o kadar büyük bir sorun olmasa da, karmaşık olay işleme için bu, kodun daha iyi okunabilirliği ve sürdürülebilirliği anlamına gelebilir.
  • OnClickListener bir arabirim olduğundan, onu uygulayan sınıf, olayı işlemek için ihtiyaç duyduğu örnek değişkenleri ve yöntemleri belirlemede esnekliklere sahiptir. Yine, bu basit durumlarda büyük bir sorun değildir, ancak karmaşık durumlarda, olayı tetikleyen View koduyla olay işleme ile ilgili değişkenleri / yöntemleri gerekli şekilde karıştırmak istemiyoruz.
  • XML Layout'ta işlev bağlamalı onClick, onClick ile çağıracağı işlev arasındaki bir bağlamadır. OnClick'in çalışması için işlevin bir bağımsız değişkeni (Görünüm) olması gerekir.

Her ikisi de aynı şekilde çalışır, sadece biri java kodu ve diğeri xml kodu ile ayarlanır.

setOnClickListener Kod Uygulaması:

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

XML Uygulaması:

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

Verim:

Her ikisi de performansta aynıdır. Xml, derleme sırasında ikili koda önceden ayrıştırılır. bu yüzden Xml'de fazlalık yoktur.

Sınırlama:

android: onClick, API seviyesi 4 ve sonrası içindir, bu nedenle <1.6'yı hedefliyorsanız, kullanamazsınız.


`Xml, derlenirken ikili koda önceden çözümlenir` Bu ifade tam olarak ne anlama geliyor? Manifest dosyasında android: onClick bulunan bir apk'nin dexcode'unu gördüğümden, ancak dinleyiciyi
VicX

harika bir açıklama. +1
Zia Ur Rahman

1
Aslında, XML'de bazı ek yükler var . Düğmeye ilk kez tıklandığında, çağrılması gereken yöntemi belirlemek için yansıma kullanılır . Bununla birlikte, bu çoğu kullanım durumu için muhtemelen ihmal edilebilir (ve erken optimizasyon tüm kötülüklerin köküdür).
Yoel

22

Kimsenin bundan bahsetmediği için şok oldum, ancak dikkatli olun, android:onClickXML tıklamayı işlemek için uygun bir yol gibi görünse de, setOnClickListeneruygulama onClickListener. Aslında, view özelliğini clickabletrue yaptı.

Çoğu Android uygulamasında sorun olmasa da, telefon kurucusuna göre düğme her zaman varsayılan olarak tıklanabilir = true'dur, ancak bazı telefon modellerinde diğer yapıcıların Button olmayan görünümlerde varsayılan bir tıklanabilir = false değeri olabilir.

Bu nedenle, XML'i ayarlamak yeterli değildir, her zaman android:clickable="true"non-button eklemek için düşünmeniz gerekir ve varsayılanın tıklanabilir = true olduğu bir cihazınız varsa ve bu XML özelliğini koymayı bir kez bile unutursanız, fark etmezsiniz sorun, çalışma zamanında ancak müşterilerinizin eline geçtiğinde piyasadan geri bildirim alacaksınız!

Ek olarak, proguard'ın XML özniteliklerini ve sınıf yöntemini nasıl gizleyeceğinden ve yeniden adlandıracağından asla emin olamayız, bu nedenle bir gün asla bir hatayla karşılaşmayacakları için% 100 güvenli değil.

Bu nedenle, asla sorun yaşamak istemezseniz ve bunu asla düşünmezseniz, setOnClickListenerButterKnife gibi ek açıklamalı kütüphaneleri kullanmak daha iyidir@OnClick(R.id.button)


1
Kullanırken şaşırtma nedeniyle oluşan herhangi bir deneyiminiz oldu mu (veya bir yerde gördünüz mü) android:onClick?
Akram

Teşekkürler bayım! Cevabınız çok yardımcı oldu!
Yi Shen

13

Basitçe:

android:onClick = "someMethod" Xml'de varsa public void someMethod, Activity sınıfınızda arar . doğrudan FaaliyetinizdenOnClickListener çağrılır ve belirli bir özellikle bağlantılıdır . Örneğin aşağıdaki kodda ve basıldığında ne yapılması gerektiği söyleniyor .ViewsomeButton.setOnClickListenersomeButton

Umarım yardımcı olur :)


4

Daha önce de belirtildiği gibi: her ikisi de bir olaya yanıt olarak mantık eklemenin bir yoludur, bu durumda bir 'tıklama' olayıdır.

Tıpkı HTML / JavaScript dünyasında yaptığımız gibi, mantık ve sunum arasında bir ayrım yapardım: XML'yi sunum için bırakın ve kod aracılığıyla olay dinleyicileri ekleyin.


1
Kabul edildi, bazı basit davranışları olan çok küçük bir uygulama olmadığı sürece, tüm yürütme kodunuz ayrı ve iyi organize edilmiş olmalı, tercihen ayrı yöntemler kullanılarak
OzzyTheGiant

0

Yalnızca bir yöntemi kullanan birkaç düğmeniz varsa, bunu java'da yapmanızı öneririm. Ancak belirli bir yöntemi olan bir düğmeniz varsa, onClick in XML daha iyi olur.


0

Her zaman android: onClick özniteliğini kullanmak daha uygundur, örneğin, Çalışma zamanında Düğmeyi başlatırsanız veya bir Fragment alt sınıfında tıklama davranışını bildirmeniz gerekirse, iyi bir nedeniniz yoksa.


3
Android: onClick kullanan diğer insanlardan gelen kodu nadiren gördüm ve başka birinin koduna baktığınızda en kafa karıştırıcı olanıdır. SetOnClickListener'ın tüm olasılıklarına sahip olmadığından, neredeyse herkes bence sadece setOnClickListener kullanıyor
Christian

0

Programlı olarak bir OnClickListener. İlki, uygulamanız çalışırken düğmenizin davranışını değiştirmek isteyip istemediğinizdir. Düğmenizi tamamen başka bir yönteme işaret edebilir veya OnClickListenerhiçbir şey yapmayan bir ayarlayarak düğmeyi devre dışı bırakabilirsiniz .

onClickÖzniteliği kullanarak bir dinleyici tanımladığınızda , görünüm yalnızca ana bilgisayar etkinliğinde bu ada sahip bir yöntemi arar. Programlı bir şekilde bir ayarlamak, OnClickListenerbir düğmenin davranışını ana bilgisayar etkinliği dışında bir yerden kontrol etmenize olanak tanır. Bu Fragments, temelde mini etkinlikler olan ve kendi yaşam döngülerine sahip yeniden kullanılabilir görünüm koleksiyonları oluşturmanıza olanak tanıyan kullandığımızda çok alakalı hale gelecektir ve bunlar daha sonra faaliyetler halinde birleştirilebilir. Parçalar OnClickListeners, Etkinlikler olmadıklarından ve onClick'te tanımlanan dinleyiciler için aranmayacağından, düğmelerini kontrol etmek için her zaman kullanmalıdır .


-2

Sanırım aralarındaki temel fark:

OnClick: Parmağınızla düğmeye tıkladığınızda.

OnClickListner: Çeşitli kodlarda uygulanabilen daha geniş bir seçim olabilir.

Örneğin, url "ymail.com" yazdığınızda, yahoo tarayıcınızdan kullanıcı adınızı ve şifrenizi bulur ve postanızı açmak için durum düğmesini tıklayın. Bu eylem yalnızca onClickListener'da uygulanmalıdır.

Bu benim fikrim!


Bu ilginç ama bundan çok daha fazlası var; seninki daha ziyade bir yorum olmalıydı.
Dakatine
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.