web-dev-qa-db-fra.com

Android - setOnClickListener vs OnClickListener vs View.OnClickListener

D'après ce que je comprends, lorsque je crée un objet bouton qui écoute un clic, je dois:

  1. Créer l'objet bouton
  2. Utilisez OnClickListner pour qu’il écoute le clic de l’utilisateur
  3. Utilisez onClick pour exécuter des actions après que l'utilisateur a cliqué sur le bouton

Maintenant,

  • Où se situe setOnClickListener dans la logique ci-dessus?
  • Lequel écoute réellement le clic du bouton?
  • setOnClickListener?
  • OnClickListener?
  • View.OnClickListener?
  • Quelles sont les différences entre ces trois?

Voici ce que j'ai trouvé dans Android Dev:

//The example below shows how to register an on-click listener for a Button.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

Vous pouvez également trouver plus pratique d’implémenter OnClickListener dans votre Activity. Cela évitera la charge de classe supplémentaire et les allocations d'objets. Par exemple:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
         Button button = (Button)findViewById(R.id.corky);
         button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
}
32
ninjayoto

La logique est simple. setOnClickListener appartient à l'étape 2.

  1. Vous créez le bouton
  2. Vous créez une instance de OnClickListener * comme dans cet exemple et remplacez la méthode onClick-.
  3. Vous affectez ce OnClickListener à ce bouton en utilisant btn.setOnClickListener(myOnClickListener); dans votre méthode fragments/activities onCreate-.
  4. Lorsque l'utilisateur clique sur le bouton, la fonction onClick du OnClickListener affecté est appelée.

* Si vous import Android.view.View; vous utilisez View.OnClickListener. Si vous import Android.view.View.*; ou import Android.view.View.OnClickListener;, vous utilisez OnClickListener dans la mesure où je l’obtiens.

Une autre façon est de vous laisser activité/fragment hériter de OnClickListener. De cette façon, vous affectez votre fragment/activité en tant qu'auditeur pour votre bouton et implémentez onClick en tant que fonction membre.

22
henningj

Imaginez que nous ayons 3 boutons par exemple

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked 
            // Yes we will handle click here but which button clicked??? We don't know

        }
    };

}

Alors qu'allons-nous faire?

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked
            // Yes we will handle click here but which button clicked??? We don't know

            // So we will make
            switch (v.getId() /*to get clicked view id**/) {
                case R.id.corky:

                    // do something when the corky is clicked

                    break;
                case R.id.corky2:

                    // do something when the corky2 is clicked

                    break;
                case R.id.corky3:

                    // do something when the corky3 is clicked

                    break;
                default:
                    break;
            }
        }
    };

}

Ou on peut faire ça:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky is clicked
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky2 is clicked
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky3 is clicked
            }
        });

    }

}

Ou nous pouvons implémenter View.OnClickListener et je pense que c'est le meilleur moyen:

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // do something when the button is clicked
        // Yes we will handle click here but which button clicked??? We don't know

        // So we will make
        switch (v.getId() /*to get clicked view id**/) {
            case R.id.corky:

                // do something when the corky is clicked

                break;
            case R.id.corky2:

                // do something when the corky2 is clicked

                break;
            case R.id.corky3:

                // do something when the corky3 is clicked

                break;
            default:
                break;
        }
    }
}

Enfin, il n'y a pas de réelle différence ici Just "Bien meilleur que l'autre"

54
Ibrahim Disouki

Veuillez noter que par souci de simplicité, je n’ai fait référence qu’au premier extrait de code, c.-à-d.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

setOnClickListener(View.OnClickListener l) est une méthode publique de la classe View. La classe Button étend la classe View et peut donc appeler la méthode setOnClickListener(View.OnClickListener l).

setOnClickListener enregistre un rappel à invoquer lorsque l'utilisateur clique sur la vue (bouton dans votre cas). Cette réponse devrait répondre à vos deux premières questions:

1. Où se situe setOnClickListener dans la logique ci-dessus?

Ans. Il enregistre un rappel lorsque le bouton est cliqué. (Expliqué en détail dans le paragraphe suivant).

2. Lequel écoute réellement le clic du bouton?

Ans. La méthode setOnClickListener est celle qui écoute réellement le clic du bouton.

Lorsque je dis qu'il enregistre un rappel à appeler, je veux dire qu'il exécutera le View.OnClickListener l qui est le paramètre d'entrée de la méthode. Dans votre cas, ce sera mCorkyListener mentionné dans button.setOnClickListener(mCorkyListener); qui exécutera ensuite la méthode onClick(View v) mentionnée dans

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

Pour aller plus loin, OnClickListener est une définition d'interface permettant de rappeler un rappel lorsque vous cliquez sur une vue (bouton dans votre cas). Disons simplement que lorsque vous cliquez sur ce bouton, les méthodes de mCorkyListener (car il s’agit d’une implémentation de OnClickListener) sont exécutées. Mais, OnClickListener a juste une méthode qui est OnClick(View v). Par conséquent, toute action à effectuer en cliquant sur le bouton doit être codée dans cette méthode.

Maintenant que vous savez ce que setOnClickListener et OnClickListener signifient, je suis sûr que vous pourrez faire la différence entre les deux vous-même. Le troisième terme View.OnClickListener est en réalité OnClickListener lui-même. La seule raison pour laquelle vous l'avez précédé View. est la différence entre les instructions import au début du programme. Si vous n'avez que import Android.view.View; comme instruction d'importation, vous devrez utiliser View.OnClickListener. Si vous mentionnez l'une de ces instructions d'importation: import Android.view.View.*; ou import Android.view.View.OnClickListener;, vous pouvez ignorer le View. et simplement utiliser OnClickListener.

7
Roger Amanna

View est la super-classe de tous les widgets et l'interface OnClickListener appartient à cette classe. Tous les widgets héritent de cela. View.OnClickListener est identique à OnClickListener. Vous devez remplacer la méthode onClick (View View) à partir de cet écouteur pour réaliser l'action souhaitée pour votre bouton.

Pour indiquer à Android d'écouter les événements de clic d'un widget, vous devez procéder comme suit:

widget.setOnClickListener(this); // If the containing class implements the interface
// Or you can do the following to set it for each widget individually
widget.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Do something here
    }
});

Le paramètre 'View' transmis dans la méthode onClick () permet simplement à Android de savoir qu'une vue a été cliquée. Ce peut être un bouton, un textView ou autre chose. C'est à vous de définir un OnClickListener pour chaque widget ou simplement de faire en sorte que la classe contenant tous ces widgets implémente l'interface. Dans ce cas, vous aurez une méthode onClick () commune pour tous les widgets et tout ce que vous avez à faire est de vérifier l'ID de la vue transmise à la méthode, puis de faire correspondre ce résultat à celui de chaque élément souhaité. prendre des mesures pour cet élément.

4
ucsunil
  1. Tout d'abord, il n'y a pas de différence entre View.OnClickListener et OnClickListener. Si vous utilisez simplement View.OnClickListener directement, vous n'avez pas besoin d'écrire-

    importer Android.view.View.OnClickListener

  2. Vous définissez une occurrence OnClickListener (par exemple, _ objet nommé myListener) comme écouteur dans une vue via setOnclickListener(). Lorsqu'un événement click est déclenché, cette méthode myListener est notifiée et sa méthode onClick(View view) est appelée. C’est là que nous faisons notre propre travail. J'espère que cela vous aide.

3
Amit K. Saha