Comment puis-je passer un paramètre à un OnClickListener ()?
J'ai mon auditeur:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
J'ai 12 boutons et je ne veux pas écrire 12 auditeurs pour eux, ce serait bien de leur passer une chaîne et ils peuvent faire des choses complètement différentes.
Utilisez votre propre OnClickListener personnalisé
public class MyLovelyOnClickListener implements OnClickListener
{
int myLovelyVariable;
public MyLovelyOnClickListener(int myLovelyVariable) {
this.myLovelyVariable = myLovelyVariable;
}
@Override
public void onClick(View v)
{
//read your lovely variable
}
};
ne autre solution à ce problème, vous pouvez créer une méthode régulière et lui transmettre le View
auquel vous souhaitez ajouter le onClickListener
, puis passez le paramètres que vous voulez utiliser avec:
Button b1 = new Button();
String something = "something";
Button b2 = new Button();
String anotherSomething = "anotherSomething";
setOnClick(b1, something);
setOnClick(b2, anotherSomething);
private void setOnClick(final Button btn, final String str){
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Do whatever you want(str can be used here)
}
});
}
Traitez votre chaîne en fonction du bouton sur lequel vous avez cliqué
public class _Test2Activity extends Activity implements OnClickListener {
private Button button1;
private Button button2;
private Button button3;
private String myString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
button3 = (Button)findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
myString = "This is a string";
}
@Override
public void onClick(View v) {
if(v==button1) {
//do something with myString
} else if(v==button2) {
//do something with myString
} else if (v==button3) {
//do something with myString
}
}
}
Je sais que c'est une réponse tardive, mais j'espère que cela pourra aider quelqu'un. Aucune des réponses existantes n'a fonctionné dans ma situation mais j'ai fini par utiliser la fonctionnalité setTag d'une image qui agissait comme un bouton. Les informations relatives à mon compte figuraient dans une variable de membre globale définie au démarrage de l'activité.
Dans ce cas, je suis en train de mettre en place une table avec chaque ligne étant un compte. Les détails du compte sont affichés lorsque l'utilisateur clique sur l'image (l'image n'est qu'une icône d'informations).
Ainsi:
// prior code....
// NOTE: oneAccount is an object (AccountInfo) holding information about the account
// column with the "detail" arrow
image1 = new ImageView(this);
image1.setImageResource(R.drawable.info);
image1.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
image1.setPadding(15, 1, 15, 1);
image1.setTag(oneAccount);
// add a listener to go to that account detail on a click
image1.setOnClickListener(new TextView.OnClickListener() {
public void onClick(View v) {
// change the color to signify a click
v.setBackgroundColor(getResources().getColor(R.color.button_selected));
// get what we need out of the tag
AccountInfo thisAcct = (AccountInfo) v.getTag();
// your code would do other stuff here
}
});
// add the image to the table row
tr1.addView(image1);
Notez que vous faites cela dans Kotlin un peu différemment de la façon dont vous le faites en Java. En Kotlin, vous ajoutez NameOfParentClass()
à la déclaration de sous-classe.
Remplacez maintenant la méthode onCreate()
de Activity. Cela ressemblera à quelque chose comme ça.
class MainActivity : AppCompatActivity() {
private var btnClick: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnClick = findViewById(R.id.btnClick) as Button
btnClick!!.setOnClickListener { startActivity(Intent(this@MainActivity, KotlinActivity::class.Java)) }
}
}
Si un contenu statique est associé à la vue, une autre option consiste à utiliser un HashMap
pour mapper l'identifiant de la vue sur le contenu.
private static Map<Integer, String> idToStringMap = new HashMap<Integer, String>();
Initialiser la carte dans onCreate
:
idToStringMap.put(R.id.button1, "hello");
idToStringMap.put(R.id.button2, "world");
// ...
Ensuite, obtenez la valeur de l'identifiant de vue dans onClick
:
public void onClick(View v) {
String myString = idToStringMap.get(v.getId());
}
C'est un peu plus propre que d'utiliser un long jeu de boîtiers d'interrupteur.
use implémente OnClickListener comme ci-dessous le code
public class Test extends Activity implements OnClickListener{
Button btn1;
Button btn2;
Button btn3;
Button btn4;
Button btn5;
@Override
protected void onCreate(Bundle savedInstanceState) {
//initialize btn...~~~
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case will be determine by Button's Id (R.id.blablabla)
}
}