web-dev-qa-db-fra.com

Comment passer des paramètres à OnClickListener?

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.

57
Adam Varhegyi

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
     }

  };
152
Sherif elKhatib

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)

           }
    });
}
21
Muhammed Refaat
  1. Demandez à votre activité d'implémenter View.OnClickListener
  2. Enregistrez vos boutons à l'auditeur
  3. Vérifiez quel bouton est cliqué dans onClick
  4. 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
           }
       }
    }
    
7
Mark Pazon

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);
7
Gravitoid

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)) }
        }
    }
0
Shraddha Patel

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.

0
Suragch

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)
        }
}
0
Joonsung Kim