77 votes

Inside OnClickListener Je ne peux pas accéder à beaucoup de choses - comment aborder?

À l'intérieur d'un OnClickListener, je ne peux pas accéder à la plupart des variables "extérieures" à la portée, comme ceci:

 findViewById(R.id.Button01).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent mainApps = new Intent(Intent.ACTION_MAIN);
                mainApps.addCategory(Intent.CATEGORY_LAUNCHER);
                List<ActivityInfo> activities = this.getPackageManager().queryIntentActivities(mainApps, 0);
                /*
                Intent intent = new Intent("com.sygic.drive/com.sygic/drive/.SygicDriveActivity");
                startActivity(intent);*/
            }

        });
 

Dans cet exemple, je dois obtenir PacketManager, mais je ne peux pas l'obtenir car je n'ai pas le contexte disponible dans OnClickListener.

Je pourrais faire une référence statique à l'extérieur et l'utiliser à l'intérieur, mais est-ce correct? Cela semble étrange de devoir faire ça tout le temps?

227voto

Lance Nanek Points 3393

Remplacer this dans votre code avec MyActivity.this où MyActivity est le nom de la classe de votre Activité sous-classe.

Explication: Vous êtes à la création d'un anonyme intérieur de la classe lorsque vous utilisez cette partie de votre code:
new OnClickListener() {
Les classes internes anonymes ont une référence à l'instance de la classe, elles sont créées dans. Il semble que vous créez à l'intérieur d'une Activité de sous-classe, car findViewById est une Activité à la méthode. L'activité est un Contexte, donc tout ce que vous devez faire est d'utiliser la référence à ce que vous avez automatiquement.

10voto

Al. Points 71

Vous pouvez également implémenter l'interface OnClickListener dans votre classe et éviter le recours à une classe interne anonyme. Ensuite, vous définissez l’auditeur sur un clic comme suit:

findViewById(R.id.Button01).setOnClickListener(this);

Si vous avez plusieurs boutons utilisant un seul écouteur, vous pouvez utiliser une instruction switch avec view.getId () (qui correspond à l'id de la vue dans R.id) pour les distinguer.

3voto

broschb Points 3441

Vous pouvez faire plusieurs choses, vous pouvez créer une classe interne qui implémente le onClickListener et transmettre les arguments nécessaires au constructeur de la classe. Je ne trouve toujours pas que l'approche la plus propre. En général, je crée simplement une autre méthode pour effectuer mon action. Donc, dans le onClick (View v), je ferais quelque chose comme ça.

 onClick(View v){doMyAction(myParams)}

private void doMyAction(Object params){//do stuff}
 

Et passez simplement les paramètres nécessaires de la méthode listener à la méthode en dehors du listener.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X