Android onClick in XML e OnClickListener


87

Mi rendo conto che una domanda con parole simili è stata posta in passato, ma questa è diversa. Sono abbastanza nuovo nello sviluppo di app Android e ho tre domande riguardanti le differenze tra l' android:onclick=""attributo XML e il setOnClickListenermetodo.

  1. Quali sono le differenze tra i due? La differenza tra le due implementazioni si trova in fase di compilazione, in fase di esecuzione o in entrambe?

  2. Quali casi d'uso sono favorevoli a quale implementazione?

  3. Quali differenze fa l'uso dei frammenti in Android nella scelta dell'implementazione?


2
Per # 2: dovresti fare attenzione quando usi xml in onclickquanto è necessario assicurarti che ogni classe implementi quel metodo. Questo presuppone che tu stia utilizzando il layout più di una volta. Tuttavia, se dovessi avere un'interfaccia java per assicurarti che il metodo sia in tutte le classi che lo hanno implementato, non dovresti preoccuparti.
Uxonith

Avere un'interfaccia java come hai descritto non sarebbe più o meno lo stesso che estendere o impiantare OnClickListener?
KG6ZVP

Ho già esaminato questo aspetto e penso che ci sia qualcosa di più delle preferenze, ma mi dispiace di non poter dire molto di più dato che è passato un po 'di tempo. Mi piace android:onclickquando è conveniente, ma so che a volte ha causato problemi, e non ricordo neanche quelli :)
Uxonith

xml onClick non funziona per gli elementi di layout annidati che vengono gonfiati dinamicamente nel livello API 19
Amit Kaushik

1
Raramente ho visto codice di altre persone che implementano Android: onClick ed è il più confuso quando si guarda il codice di qualcun altro. Poiché non ha tutte le possibilità di setOnClickListener, quasi tutti usano solo setOnClickListener secondo me
Christian

Risposte:


124

Differenza tra OnClickListener e OnClick:

  • OnClickListener è l'interfaccia che devi implementare e può essere impostata su una visualizzazione in codice java.
  • OnClickListener è ciò che attende che qualcuno faccia effettivamente clic, onclick determina cosa succede quando qualcuno fa clic.
  • Ultimamente Android ha aggiunto un attributo xml alle viste chiamato android: onclick, che può essere utilizzato per gestire i clic direttamente nell'attività della vista senza bisogno di implementare alcuna interfaccia.
  • Puoi facilmente scambiare un'implementazione dell'ascoltatore con un'altra, se necessario.
  • Un OnClickListener ti consente di separare l'azione / il comportamento dell'evento clic dalla vista che attiva l'evento. Mentre per casi semplici questo non è un grosso problema, per la gestione di eventi complessi, ciò potrebbe significare una migliore leggibilità e manutenibilità del codice
  • Poiché OnClickListener è un'interfaccia, la classe che la implementa ha flessibilità nel determinare le variabili di istanza e i metodi di cui ha bisogno per gestire l'evento. Ancora una volta, questo non è un grosso problema nei casi semplici, ma per i casi complessi, non vogliamo necessariamente confondere le variabili / metodi relativi alla gestione degli eventi con il codice della View che attiva l'evento.
  • OnClick con associazione di funzione nel layout XML è un'associazione tra onClick e la funzione che chiamerà. La funzione deve avere un argomento (la vista) affinché onClick funzioni.

Entrambi funzionano allo stesso modo, solo quello viene impostato tramite codice java e l'altro tramite codice xml.

implementazione del codice setOnClickListener:

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
}

Implementazione XML:

<?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 -->

Prestazione:

Entrambi sono gli stessi in termini di prestazioni. Xml viene pre-analizzato in codice binario durante la compilazione. quindi non c'è overhead in Xml.

Limitazione:

android: onClick è per API dal livello 4 in poi, quindi se scegli come target <1.6, non puoi usarlo.


`Xml è pre-analizzato in codice binario durante la compilazione` Cosa significa esattamente questa istruzione? Da quando ho visto il dexcode di un apk che ha android: onClick nel suo file manifest, ma non ho trovato alcun codice che imposti
VicX

spiegazione impressionante. +1
Zia Ur Rahman

1
In realtà, c'è qualche sovraccarico in XML . Quando si fa clic sul pulsante per la prima volta, viene utilizzata la reflection per determinare il metodo da richiamare . Tuttavia, questo è probabilmente trascurabile per la maggior parte dei casi d'uso (e l'ottimizzazione prematura è la radice di tutti i mali).
Yoel

22

Sono scioccato che nessuno ne abbia parlato, ma attenzione, anche se android:onClickXML sembra essere un modo conveniente per gestire i clic, l' setOnClickListenerimplementazione fa qualcosa di più dell'aggiunta di onClickListener. In effetti, mette la proprietà view clickablesu true.

Anche se potrebbe non essere un problema sulla maggior parte delle implementazioni Android, secondo il costruttore del telefono, il pulsante è sempre predefinito su clickable = true ma altri costruttori su alcuni modelli di telefono potrebbero avere un clickable = false predefinito su visualizzazioni non Button.

Quindi impostare l'XML non è sufficiente, devi pensare tutto il tempo ad aggiungere un android:clickable="true"pulsante non, e se hai un dispositivo in cui l'impostazione predefinita è cliccabile = vero e dimentichi anche una volta di mettere questo attributo XML, non te ne accorgerai il problema in fase di esecuzione ma riceverai il feedback sul mercato quando sarà nelle mani dei tuoi clienti!

Inoltre, non possiamo mai essere sicuri di come proguard offuscherà e rinominerà gli attributi XML e il metodo di classe, quindi non siamo sicuri al 100% che non avranno mai un bug un giorno.

Quindi se non vuoi mai avere problemi e non pensarci mai, è meglio usare setOnClickListenero librerie come ButterKnife con annotazioni@OnClick(R.id.button)


1
Hai avuto esperienza (o visto da qualche parte) che il bug si è verificato a causa dell'offuscamento durante l'utilizzo android:onClick?
Akram

Grazie Signore! La tua risposta è molto utile!
Yi Shen

13

Semplicemente:

Se hai android:onClick = "someMethod" in xml , cerca il file public void someMethodnella tua classe Activity. OnClickListenersi chiama proprio dalla tua Attività ed è legato ad alcuni particolari View. Ad esempio someButton.setOnClickListenere nel codice sottostante si dice cosa si deve fare quando someButtonviene premuto.

Spero che sia d'aiuto :)


4

Come detto prima: entrambi sono un modo per aggiungere logica in risposta a un evento, in questo caso un evento "clic".

Vorrei scegliere una separazione tra logica e presentazione, proprio come facciamo nel mondo HTML / JavaScript: lasciare l'XML per la presentazione e aggiungere ascoltatori di eventi tramite codice.


1
D'accordo, a meno che non sia un'app molto piccola con un comportamento semplice, tutto il codice in esecuzione dovrebbe essere tenuto separato e ben organizzato, preferibilmente utilizzando metodi separati
OzzyTheGiant

0

Se hai più pulsanti che utilizzano un solo metodo, ti suggerisco di farlo in java. Ma se hai un pulsante con un metodo specifico, onClick in XML sarebbe meglio.


0

È più conveniente utilizzare sempre l'attributo android: onClick a meno che non si abbia una buona ragione per non farlo, ad esempio, se si istanzia il Button in fase di esecuzione o se è necessario dichiarare il comportamento del clic in una sottoclasse Fragment.


3
Raramente ho visto codice di altre persone che implementano Android: onClick ed è il più confuso quando si guarda il codice di qualcun altro. Poiché non ha tutte le possibilità di setOnClickListener, quasi tutti usano solo setOnClickListener secondo me
Christian

0

Esistono un paio di motivi per cui potresti voler impostare a livello di codice un file OnClickListener. Il primo è se vuoi cambiare il comportamento del tuo pulsante mentre la tua app è in esecuzione. Puoi puntare il tuo pulsante su un altro metodo completamente o semplicemente disabilitare il pulsante impostando un OnClickListenerche non fa nulla.

Quando si definisce un listener utilizzando l' onClickattributo, la vista cerca un metodo con quel nome solo nella sua attività host. L'impostazione a livello di codice di un OnClickListenerconsente di controllare il comportamento di un pulsante da un punto diverso dalla sua attività host. Ciò diventerà molto rilevante quando utilizzeremo Fragments, che sono fondamentalmente mini attività, che consentono di creare raccolte riutilizzabili di viste con il proprio ciclo di vita, che possono quindi essere assemblate in attività. I frammenti devono sempre essere utilizzati OnClickListenersper controllare i pulsanti, poiché non sono attività e non verranno cercati i listener definiti in onClick.


-2

Penso che la differenza principale tra loro sia:

Al clic: quando si fa clic sul pulsante con il dito.

OnClickListner: Potrebbe essere una scelta più ampia che può essere implementata in vari codici.

Ad esempio, quando digiti l'url "ymail.com", yahoo trova il tuo nome utente e la tua password dal browser e abilita il pulsante di stato clic per aprire la posta. Questa azione dovrebbe essere implementata solo in onClickListener.

Questa è la mia idea!


Questo è interessante ma c'è molto di più; il tuo dovrebbe piuttosto essere un commento.
Dakatine
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.