Lorsque que l’on écrit un widget ou vue personalisé , les Listeners de base tel que onClickListener ne sont parfois pas suffisants. On peut avoir besoin de déclarer ses propres listeners qui répondront à des cas très précis.
Voici un exemple générique d’implémentation de listener personalisé ou custom listener.
Interface :
Nous supposons que votre widget est déjà en partie crée. Dans notre exemple il s’appelera MyCustomView.
La première étape est de créer une interface qui va gérer le Listener :
public interface OnMyCustomeEventListener { public abstract void onMyCustomEvent(); }
Cette interface ne comporte qu’une méthode abstraite pour rester simple , mais il est bien entendu possible de faire quelque chose de plus complexe avec plusieurs méthodes à redéfinir.
Modification de la vue personnalisée :
Passons à la vue. je n’ai garder que le code qui nous intéresse ici :
class MyCustomView extends View { private OnMyCustomEventListener eventListener = null; /* * Le code de votre widget */ public void setOnMyCustomEventListener(OnMyCustomeEventListener listener) { this.eventListener = listener; } private void onMyCustomEvent() { if(eventListener != null) eventListener.onMyCustomEvent(); } }
1- On commence avec une variable qui contiendra une instance de notre listener.
2- On ajoute ensuite un setter setOnMyCustomEventListener pour que l’on puisse définir notre listener depuis l’activity.
3- On termine ensuite avec une méthode onMyCustomEvent que vous pourrez appelez ou vous voudrez dans votre code.
L’intérêt de cette dernière méthode c’est que l’on va y faire tous les tests nécessaires à la réalisation de l’événement. Nous testons dans l’exemple l’existance d’une instance de OnMyCustomeEventListener mais on pourrait imaginer vérifier d’éventuels paramètres conditionnant l’execution de l’événement.
Une fois ces 3 étapes ajoutées à votre widget , le plus gros du travail est fait. Il ne reste plus qu’à définir votre listener dans l’activity
Ajout du Listener :
public class MyActivity extends Activity { private OnMyCustomeEventListener MyCustomViewListener = new OnMyCustomeEventListener () { @Override public void onMyCustomEvent() { //Ecrire ici votre événement } } public void onCreate(Bundle savedInstanceState) { MyCustomView myView = (MyCustomView) findViewById(R.id.myView); myView.setOnMyCustomEventListener(MyCustomViewListener); } }
Dans notre activity on créer une variable qui instancie notre interface. Cette variable est donc notre listener. Ne reste ensuite qu’à passer ce listener à notre vue personnalisée via le setter précédemment défini.