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:
- Créer l'objet bouton
- Utiliser
OnClickListner
pour le faire écouter à l'utilisateur clique sur - 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
}
}
5 réponses
La logique est simple. setOnClickListener
appartient à l'étape 2.
- Vous créez le bouton
- Vous créez une instance de
OnClickListener
* comme dans cet exemple et Outrepasser leonClick
-méthode. - Vous assigner
OnClickListener
pour que le bouton à l'aide debtn.setOnClickListener(myOnClickListener);
dans vos fragments/activitésonCreate
-méthode. - Quand l'utilisateur clique sur le bouton, le
onClick
la fonction assignéeOnClickListener
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.
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"
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
.
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.
tout d'Abord, il n'y a pas de différence entre
View.OnClickListener
etOnClickListener
. Si vous venez d'utiliserView.OnClickListener
directement, alors vous n'avez pas besoin d'écrire-importer android.vue.Vue.OnClickListener
vous définissez une instance OnClickListener (par exemple
myListener
named object) comme l'écouteur d'une vue viasetOnclickListener()
. Lorsqu'unclick
événement est déclenché, quemyListener
notifié et c'estonClick(View view)
méthode est appelée. C'est là que nous faisons notre propre tâche. Espérons que cela vous aide.