web-dev-qa-db-fra.com

Boutons multiples 'OnClickListener () android

Je suis en train de faire une application simple calculatrice sur Android. J'essaie de configurer le code de sorte que lorsqu'un bouton de numéro est enfoncé, l'écran de la calculatrice soit mis à jour avec ce numéro. Actuellement, je le fais comme ça. 

    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView output = (TextView) findViewById(R.id.output);
            output.append("1");
        }
    });

Cela fonctionne mais j'écris le même code pour chaque bouton de la calculatrice. Comme vous pouvez l’imaginer, il est très redondant. Est-ce que je peux quand même écrire ce code de manière plus efficace? Celui qui implique de ne pas écrire cette méthode pour chaque bouton? 

64
user3011685

Il vous suffit simplement de suivre ces étapes pour simplifier les choses ...

Vous n'êtes pas obligé d'écrire new onClickListener pour Every Button... Il suffit d'implémenter View.OnClickLister dans votre ActivityFragment .. ELLE IMPLÉMENTERA UNE NOUVELLE MÉTHODE APPELÉE onClick() POUR LA GESTION DES ÉVÉNEMENTS ONCLICK POUR Button, TEXTVIEW`, ETC. 

  1. _/IMPLÉMENTE OnClickListener() DANS VOTRE Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Implémentez la méthode onClick () dans votre activité/fragment
public class MainActivity extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onClick(View v) {
      // default method for handling onClick Events..
    }
}
  1. Implement OnClickListener() For Buttons
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(this); // calling onClick() method
    Button two = (Button) findViewById(R.id.twoButton);
    two.setOnClickListener(this);
    Button three = (Button) findViewById(R.id.threeButton);
    three.setOnClickListener(this);

}
  1. Rechercher des boutons par ID et implémenter votre code ..
@Override
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.oneButton:
            // do your code
            break;

        case R.id.twoButton:
            // do your code
            break;

        case R.id.threeButton:
            // do your code
            break;

        default:
            break;
    }

}

Veuillez vous référer à ce lien pour plus d'informations: 

https://androidacademic.blogspot.in/2016/12/multiple-buttons-onclicklistener-Android.html

Cela facilitera la gestion de nombreux événements de clic de boutons et simplifiera sa gestion ...

196
Pragnesh Ghoda シ

Vous pouvez définir la propriété:

Android:onClick="buttonClicked"

dans le fichier XML pour chacun de ces boutons et utilisez-le dans le code Java:

public void buttonClicked(View view) {

    if (view.getId() == R.id.button1) {
        // button1 action
    } else if (view.getId() == R.id.button2) {
        //button2 action
    } else if (view.getId() == R.id.button3) {
        //button3 action
    }

}
44
Andro

J'ai créé une classe dédiée qui implémente View.OnClickListener.

public class ButtonClickListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
    }

}

Ensuite, j'ai créé une instance de cette classe dans MainActivity

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

puis définissez onClickListener pour le bouton

btn.setOnClickListener(onClickBtnListener);
8
Vadim Novitskiy

Définissez une étiquette sur chaque bouton en fonction de ce que vous voulez utiliser, dans ce cas probablement un entier. Ensuite, vous n'avez besoin que d'un seul OnClickListener pour tous vos boutons:

Button one = (Button) findViewById(R.id.oneButton);
Button two = (Button) findViewById(R.id.twoButton);
one.setTag(new Integer(1));
two.setTag(new Integer(2));

OnClickListener onClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        TextView output = (TextView) findViewById(R.id.output);
        output.append(v.getTag());
    }
}

one.setOnClickListener(onClickListener);
two.setOnClickListener(onClickListener);
6
Henrik Christensen
public class MainActivity extends AppCompatActivity implements OnClickListener  {
    Button  b1,b2;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1= (Button) findViewById(R.id.button);
        b2= (Button) findViewById(R.id.button2);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
    }


    @Override
    public void onClick(View v)
    {
        if(v.getId()==R.id.button)
        {
            Intent intent=new Intent(getApplicationContext(),SignIn.class);
            startActivity(intent);
        }
        else if (v.getId()==R.id.button2)
        {
            Intent in=new Intent(getApplicationContext(),SignUpactivity.class);
            startActivity(in);
        }
    }
}
2
Abhishek Choubey

J'ai eu un problème similaire et ce que j'ai fait est: Créer un tableau de boutons

Button buttons[] = new Button[10];

Ensuite, pour mettre en œuvre sur l'écouteur de clic et référence xml id j'ai utilisé une boucle comme celle-ci

for (int i = 0; i < 10; i++) {      
String buttonID = "button" + i;
        int resID = getResources().getIdentifier(buttonID, "id",
                "your package name here");
        buttons[i] = (Button) findViewById(resID);
        buttons[i].setOnClickListener(this);
    }

Mais les appeler reste le même que dans le point 4 de la réponse de Prag ... PS. Si quelqu'un a une meilleure méthode pour appeler tous les boutons du bouton, veuillez commenter.

1
Akshit Agarwal

Implémentez la méthode onClick () dans votre activité/fragment Public class MainActivity extended Activity implémente View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onClick(View v) {

commutateur (itemId) {

// si vous appelez le fragment avec la barre de nevigation alors utilisé.

       case R.id.nav_menu1:
            fragment = new IntroductionFragment();
            break;

// si l'activité d'appel avec la barre de nevigation est utilisée.

        case R.id.nav_menu6:
            Intent i = new Intent(MainActivity.this, YoutubeActivity.class);
            startActivity(i);
  // default method for handling onClick Events..
}

}

1
vicky mahale
public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case R.id.button1:
            //do ur code
            Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show();
            break;
        case R.id.button2:
            Intent intent = new Intent(this,SecondActivity.class);
            Intent.putExtra("key",value);
            startActivity(intent);
            break;
        case R.id.button3:
            //do ur code
            break;
        case R.id.button4:
            //do ur code;
            break;
        default:
            //do ur code;
    }
}
1
Sazidur Rahman
    you can do like this

    TextView output = (TextView) findViewById(R.id.output);
    one.setOnClickListener(youractivity.this);
    // set the onclicklistener for other buttons also

    @Override
    public void onClick(View v) {
      int id = v.getId();
    switch(id) {
    case R.id.oneButton:      
       append("1",output);
       break;
    case R.id.twoButton:
        append("2",output);
       break;
    case R.id.threeButton:
        append("3",output);
       break;
     } 
      }

 private void append(String s,TextView t){
  t.setText(s); 
}

    you can identify the views in your activity in a seperate method. 
    Hope this will help you.
0
user3905781

Je trouve que l'utilisation d'une longue chaîne if/else (ou d'un commutateur), en plus de la liste de findViewById(btn).setOnClickListener(this), est moche. que diriez-vous de créer de nouveaux View.OnlickListeners avec override, en ligne:

findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signIn(); }});
findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signOut(); }});
findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { decryptThisTest(); }});
findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBookTickers(); }});
findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBalances(); }});
0
mholberger