Android-setOnClickListener vs OnClickListener vs View.OnClickListener

ma compréhension est que lorsque je crée un objet bouton qui écoute un clic, je dois:

  1. Créer l'objet bouton
  2. Utiliser OnClickListner pour le faire écouter à l'utilisateur clique sur
  3. Utiliser onClick pour exécuter une action lorsque l'utilisateur clique sur le bouton

Maintenant,

  • d'Où setOnClickListener s'insérer dans la logique ci-dessus?
  • lequel écoute réellement le clic sur le bouton?
  • <!--4?
  • <!--6?
  • <!--7?
  • 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 aussi trouver plus pratique d'implémenter OnClickListener comme une partie de votre Activity. Cela évitera la charge de la classe supplémentaire et les attributions d'objet. 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
    }
}
29
demandé sur LAD 2015-04-07 00:03:36

5 réponses

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 Outrepasser le onClick-méthode.
  3. Vous assigner OnClickListener pour que le bouton à l'aide de btn.setOnClickListener(myOnClickListener); dans vos fragments/activités onCreate-méthode.
  4. Quand l'utilisateur clique sur le bouton, le onClick la fonction assignée OnClickListener 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 autant que je le reçois.

une autre façon est de vous laisser l'activité / le fragment hériter de OnClickListener. De cette façon, vous assignez votre fragment/activité comme écouteur pour votre bouton et implémenter onClick en tant que membre de la fonction.

17
répondu henningj 2015-04-06 21:19:49

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

        }
    };

}

Donc ce que nous allons 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 nous pouvons faire ceci:

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 la meilleure façon:

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 différences réelles ici juste "bien mieux que les autres"

46
répondu Ibrahim Disouki 2015-04-06 21:23:18

Veuillez noter que, par souci de simplicité, j'ai fait référence seulement le premier extrait de code c'est à dire,

// 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 classe de méthode de vue publique. La classe Button étend la classe View et peut donc appeler setOnClickListener(View.OnClickListener l) méthode.

setOnClickListener enregistre un rappel à invoquer lorsque la vue (bouton dans votre cas) est cliquée. Ces réponses devraient répondre à vos deux premières questions:

1. Où setOnClickListener ajuster à la au-dessus de la logique?

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

2. Lequel écoute vraiment le clic sur le bouton?

Ans. setOnClickListener méthode est celle qui écoute vraiment pour le clic sur le bouton.

quand je dis qu'il enregistre un rappel pour être invoqué, ce que je veux dire c'est qu'il lancera le View.OnClickListener l qui est le paramètre d'entrée pour la méthode. Dans votre cas, il sera mCorkyListener mentionné dans button.setOnClickListener(mCorkyListener); qui exécutera alors la méthode onClick(View v) mentionné dans l'

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

poursuivre, OnClickListener est une définition D'Interface pour un rappel à invoquer lorsqu'une vue (bouton dans votre cas) est cliquée. Simplement dire, quand vous cliquez sur ce bouton, les méthodes dans mCorkyListener (parce que c'est une implémentation de OnClickListener) sont exécutées. Mais,OnClickListener a une méthode qui est OnClick(View v). Donc, quelle que soit l'action qui doit être effectuée en cliquant sur le bouton doit être codée dans cette méthode.

Maintenant que vous savez ce setOnClickListener et OnClickListener je suis sûr que vous serez capable de faire la différence entre les deux vous-même. Le troisième terme View.OnClickListener effectivement OnClickListener lui-même. La seule raison pour laquelle vous avez View. la précéder est dû à la différence dans le import déclaration en début de programme. Si vous n'avez qu' import android.view.View; comme déclaration d'importation vous devrez utilisez View.OnClickListener. Si vous parlez de l'un de ces déclarations d'importation: import android.view.View.*; ou import android.view.View.OnClickListener; vous pouvez sauter le View. et simplement utiliser OnClickListener.

6
répondu Roger Amanna 2017-03-13 03:27:01

View est la superclasse pour tous les widgets et L'interface OnClickListener appartient à cette classe. Tous les machins héritent de ça. Vue.OnClickListener est le même que OnClickListener. Il vous faudrait modifier la méthode onClick (View view) de cet écouteur pour obtenir l'action que vous voulez pour votre bouton.

Pour dire Android pour écouter cliquez sur événements pour un widget, vous devez faire:

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' passé dans la méthode onClick() permet simplement Android sait qu'une vue a été cliqué. Il peut s'agir d'un bouton ou D'un TextView ou autre chose. C'est à vous de définir un OnClickListener pour chaque widget, ou, simplement, faire la classe contenant tous ces widgets implémenter l'interface. Dans ce cas, vous aurez une commune onClick() méthode pour tous les widgets et tout ce que vous avez à faire est de vérifier l'identité de la vue qui est passé dans la méthode, puis match que contre l'id pour chaque élément que vous souhaitez et de prendre des mesures pour que élément.

4
répondu ucsunil 2015-04-06 21:25:57
  1. tout d'Abord, il n'y a pas de différence entre View.OnClickListener et OnClickListener. Si vous venez d'utiliser View.OnClickListener directement, alors vous n'avez pas besoin d'écrire-

    importer android.vue.Vue.OnClickListener

  2. vous définissez une instance OnClickListener (par exemple myListener named object) comme l'écouteur d'une vue via setOnclickListener(). Lorsqu'un click événement est déclenché, que myListener notifié et c'est onClick(View view) méthode est appelée. C'est là que nous faisons notre propre tâche. Espérons que cela vous aide.

3
répondu Amit K. Saha 2015-04-06 21:21:14