web-dev-qa-db-fra.com

Méthode Android setOnClickListener - Comment ça marche?

J'ai du mal à comprendre ce code. Je reçois que findViewById obtiendra le widget de bouton et ensuite il le lancera. Ensuite, il utilisera le bouton pour appeler la méthode setOnClickListener. Cependant, je ne sais pas quel est cet argument qui est passé dans la setOnClickListener et je n’ai jamais vu un code comme celui-là auparavant. Comment se fait-il qu'il crée un nouvel objet mais puisse créer sa propre méthode dans les arguments d'une autre méthode? Ce serait bien si quelqu'un pouvait expliquer ça. De plus, quel type d’objet la méthode setOnClickListener prend-elle?

btn = (Button)findViewById(R.id.firstButton);
btn.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        tv.setText(months[Rand.nextInt(12)]);
        tv.setTextColor(Color.rgb(Rand.nextInt(255)+1, Rand.nextInt(255)+1, Rand.nextInt(255)+1));
    }
});
21
rayleigh

Cela fonctionne comme ça. View.OnClickListenere est défini - 

public interface OnClickListener {
    void onClick(View v);
}

Autant que nous sachions, vous ne pouvez pas instancier un objet OnClickListener, car aucune méthode n'est implémentée. Il y a donc deux façons de passer - vous pouvez implémenter cette interface qui remplacera la méthode onClick comme ceci:

public class MyListener implements View.OnClickListener {
    @Override
    public void onClick (View v) {
         // your code here;
    }
}

Mais il est fastidieux de le faire à chaque fois que vous souhaitez définir un écouteur de clic. Donc, afin d'éviter cela, vous pouvez fournir l'implémentation de la méthode sur place, comme dans un exemple que vous avez donné. 

setOnClickListener prend View.OnClickListener en tant que paramètre.

14
cliffroot

C'est le meilleur moyen d'implémenter Onclicklistener pour plusieurs boutons dans une ligne.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Ceci est un bouton dans la MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bt_submit = (Button) findViewById(R.id.submit);

    bt_submit.setOnClickListener(this);
}

Ceci est une méthode de substitution

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.submit:
                //action

                break;

            case R.id.secondbutton:
                //action
                break;
        }
    }
5
nafees ahmed

Voici la méthode manuelle dit à propos de setOnClickListener:

public void setOnClickListener (View.OnClickListener l)

Ajoutée dans l'API niveau 1 Enregistrez un rappel à appeler lorsque cette vue est affichée est cliqué. Si cette vue n'est pas cliquable, elle devient cliquable.

Paramètres

l View.OnClickListener: le rappel qui sera exécuté

Et normalement, vous devez l'utiliser comme ça 

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
    }
    ...
}

Jetez également un coup d'œil à cette leçon Création d'une calculatrice simple avec Android Studio .

0