Je construis une Android Application. J'ai remarqué que je crée de nombreuses répétitions de code similaire à celui-ci dans chacune de mes classes:
Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
J'ai maintenant quinze boutons et cela rend mon code laid. Quelqu'un at-il un cours ou des exemples sur la façon de transformer tous ces codes en quelque chose de plus efficace, pour que je puisse:
{Button buttonX (Button)findViewById(R.id.buttonXName);}
{buttonX.setOnClickListener(new OnClickListener()}
{public void onClick(View v)}
Si quelqu'un sait quelque chose, je l'apprécierais.
Si vous ciblez 1.6 ou une version ultérieure, vous pouvez utiliser Android: attribut xml onClick pour supprimer une partie du code répétitif. Voir cet article de blog par Romain Guy.
<Button
Android:height="wrap_content"
Android:width="wrap_content"
Android:onClick="myClickHandler" />
Et dans la classe Java, utilisez les lignes de code ci-dessous:
class MyActivity extends Activity {
public void myClickHandler(View target) {
// Do stuff
}
}
Implémentez OnClickListener () sur votre activité ...
public class MyActivity extends Activity implements View.OnClickListener {
}
Pour chaque bouton, utilisez ...
buttonX.setOnClickListener(this);
Dans votre test de méthode Activity onClick () pour quel bouton il s'agit ...
@Override
public void onClick(View view) {
if (View.equals(buttonX))
// Do something
}
Également dans onClick, vous pouvez utiliser view.getId () pour obtenir l'ID de la ressource, puis l'utiliser dans un bloc switch/case pour identifier chaque bouton et effectuer l'action appropriée.
public void registerButtons(){
register(R.id.buttonName1, ()-> {/*Your code goes here*/});
register(R.id.buttonName2, ()-> {/*Your code goes here*/});
register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}
private void register(int buttonResourceId, Runnable r){
findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}
public void registerButtons(){
register(R.id.buttonName1);
register(R.id.buttonName2);
register(R.id.buttonName3);
}
private void register(int buttonResourceId){
findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}
private OnClickListener buttonClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch (v.getId()) {
case R.id.buttonName1:
// TODO Auto-generated method stub
break;
case R.id.buttonName2:
// TODO Auto-generated method stub
break;
case View.NO_ID:
default:
// TODO Auto-generated method stub
break;
}
}
};
Puisque setOnClickListener
est défini sur View
pas Button
, si vous n'avez pas besoin de la variable pour autre chose, vous pouvez le rendre un peu plus agile comme ceci:
findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
Vous pouvez utiliser array pour gérer plusieurs écouteurs de clic de bouton dans Android comme ceci: je suis en train de configurer l'écouteur de clic de bouton pour n boutons en utilisant array comme:
Button btn[] = new Button[n];
NOTE: n est un entier positif constant
Exemple de code:
//class androidMultipleButtonActions
package a.b.c.app;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
public class androidMultipleButtonActions extends Activity implements OnClickListener{
Button btn[] = new Button[3];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn[0] = (Button) findViewById(R.id.Button1);
btn[1] = (Button) findViewById(R.id.Button2);
btn[2] = (Button) findViewById(R.id.Button3);
for(int i=0; i<3; i++){
btn[i].setOnClickListener(this);
}
}
public void onClick(View v) {
if(v == findViewById(R.id.Button1)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button2)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button3)){
//do here what u wanna do.
}
}
}
Remarque: écrivez d’abord un fichier main.xml si vous ne savez pas écrire, envoyez un mail à: [email protected]
Je pense que vous pouvez généralement faire ce dont vous avez besoin dans une boucle, ce qui est bien meilleur que beaucoup de méthodes onClick
si cela peut être fait.
Départ cette réponse pour une démonstration de l'utilisation d'une boucle pour un problème similaire. La manière dont vous construirez votre boucle dépendra des besoins de vos fonctions onClick
et de leur ressemblance. Le résultat final est un code beaucoup moins répétitif et plus facile à gérer.
Mettre en œuvre l'activité avec View.OnClickListener
comme ci-dessous.
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
}
}