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.