2012-11-21 28 views
21

È possibile creare una classe secondaria per contenere il Listener di OnClick? Il significato non viene creato nella classe Attività?Android - Ascoltatore OnClick in una classe separata

Ho appena scoperto che mettere gli ascoltatori di OnClick nella principale classe di attività è solo disordinato e preferiremmo averli in classi separate. Grazie

+0

Vedere questo http://stackoverflow.com/questions/13478526/android-button-navagation-with-onclick-listeners/13478749#13478749 – Ronnie

+0

Ho già fatto questo, ma questo non è quello che sto cercando. Grazie comunque – Pztar

+0

@Pztar Il link di userSeven7s dovrebbe rispondere alla tua domanda. Altrimenti, ti preghiamo di chiarire la tua domanda. –

risposta

27

Certo, è possibile. È sufficiente creare una classe che implementa View.OnClickListener e impostarla come listener su View. Per esempio:

public class ExternalOnClickListener implements View.OnClickListener { 

    public ExternalOnClickListener(...) { 
     // keep references for your onClick logic 
    } 

    @Override public void onClick(View v) { 
     // TODO: add code here 
    } 

} 

e quindi impostare un'istanza della classe di cui sopra come ascoltatore:

view.setOnClickListener(new ExternalOnClickListener(...)); 

Il costruttore con parametri è facoltativo, ma è molto probabile che avrete bisogno di passare qualcosa attraverso realmente per rendere la vostra onClick(...) lavoro logico su.

L'implementazione di una classe in modo anonimo è generalmente più semplice da utilizzare. Solo un pensiero.

+0

Grazie, questo è quello di cui avevo bisogno. Ho iniziato con questo ma mi sono completamente dimenticato del costruttore. – Pztar

+0

Ottima risposta, grazie –

+0

Se si utilizza la classe come classe interna, si dovrebbe rendere quella classe ** statica ** – Tobrun

1

Puoi farlo. Ma pensa solo che non avrai un riferimento all'attività, né ai suoi attributi, incluse tutte le visualizzazioni. (a meno che non li rendiate pubblici o accessibili con i metodi Getter).

Inoltre, prestare particolare attenzione all'archiviazione dei riferimenti all'attività o ai membri sull'ascoltatore, poiché potrebbero impedire al garbage collector di recuperare la memoria del listener.

+0

Avrai un riferimento a un contesto e alla vista su cui è stato fatto clic ...(il metodo View supporta getContext()) – Tobrun

10

Invece di mettere il onCLicklistener in una classe separata, perché non provi a definire onClickListener fuori onCreate() ??

Per es: in questo modo

onCreate()

yourViewName.setOnClicklistener(listener): 

Fuori onCreate()

private OnClickListener listener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }; 
+7

Capisco cosa stai cercando di dire, so come farlo. Ma non è quello che sto cercando. Non lo voglio nell'attività principale. Grazie però – Pztar

+0

Perché se lo fai molto, la MainActivity diventa molto lunga e difficile da leggere. Dividendola in una classe diversa, la lunghezza di MainActivity può essere più breve. – hexicle

5

Sì, è possibile. Tuttavia, rendere l'ascoltatore una classe interna ha un vantaggio: può accedere direttamente ai campi e alle variabili della classe di attività. Se si fanno una classe separata, e il vostro ascoltatore in realtà bisogno di accedere a 5 punti di vista, il vostro costruttore ascoltatore potrebbe assomigliare a questo:

MyListener listener = new MyListener(context, button, textView1, textView2, ratingBar, imageView);

che è troppo po 'ingombrante. Se il tuo ascoltatore è semplice, vai avanti e rendilo una classe separata. In caso contrario, dipende dalla leggibilità.

Problemi correlati