2010-09-25 18 views
46

me encuentro haciendo cosas como esta todo el tiempo:Una OnClickHandler para múltiples botones

Button button1 = (Button) findViewById(R.id.button1); 
    Button button2 = (Button) findViewById(R.id.button2); 
    Button button3 = (Button) findViewById(R.id.button3); 

    button1.setOnClickListener(menuButtonListener); 
    button2.setOnClickListener(menuButtonListener); 
    button3.setOnClickListener(menuButtonListener); 
... 

y

private OnClickListener myButtonListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button1 : 
    ... 

¿Hay una mejor manera de establecer el OnClickListener?

Respuesta

59

También puede configurarlo en su diseño xml usando el atributo android: onclick.

android:onClick="onClick" 

Luego en su clase de actividad agregue el método onClick.

public void onClick(View v) { 
... 

Aquí está el documentation.

+0

Ah, bonito :) Corto y eficaz. ¡Me gusta! – mseo

+1

¿Qué sucede si los botones se crean dinámicamente? – Orion

+1

@Orion Tanto este enfoque como el enfoque de mseo funcionarán también para los botones creados dinámicamente. – Tiago

35

Haga que su clase implemente `View.OnClickListener', como

public class MyActivity extends Activity implements View.OnClickListener { 

    Button button1, button2, button3; 

    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(); 

     ... 

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

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      // do stuff; 
      break; 
      case R.id.button2: 
      // do stuff; 
      break; 
     ... 
    } 
} 
+1

Bueno ... no me ahorra mucho trabajo. Es otra posibilidad de hacerlo, pero no es realmente más corto o más elegante que mi enfoque. – mseo

+0

Esto parece funcionar bien para las actividades que extienden fragmentos – CelticParser

+0

les ha gustado! ¿Cómo funciona esto ...? –

4

Cabe señalar, que

android:onclick="onClick" 

requiere SDK al menos Andoid 1.6. Por lo tanto, si desea que su aplicación sea accesible para la mayor audiencia posible, es probable que desee escribir su aplicación en Android 1.6. A menos que su aplicación requiera una función que solo está disponible en 1.6+. Por lo tanto, aunque su primer intento es un poco más laborioso, tiene una mayor compatibilidad con versiones anteriores. Normalmente lo hago de la manera en que lo haces, para mantener mi Apps 1.5 comptaible.

Editar: Es fácil pasar esto por alto, si configura Android 2.2 como SDK en la configuración de sus proyectos, pero configure la versión minSDK en 3 (1.5), ya que no da errores de compilación.

1

creo que en el caso, cuando los botones no están en actividad, pero en FragmentDialog, etc., esto puede ayudar

Context mContext = getActivity().getBaseContext(); 
mRes = mContext.getResources(); 
String[] idOfButtons = { "button1", "button2", "button3"}; 
for (int pos = 0; pos < idOfButtons.length; pos++) { 
    Integer btnId = mRes.getIdentifier(idOfButtons[pos], "id",(getActivity()).getBaseContext().getPackageName()); 
    ImageButton ib = (ImageButton) v.findViewById(btnId); 
    ib.setOnClickListener(this.onClickNum); 
} 
5

Getting @foenix respuesta, sólo tiene que hacer algo como:

int[] buttons = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7 
      , R.id.button8, R.id.button9}; 
    for (int i = 0; i < buttons.length; i++) { 
     Button buttonNum = (Button) rootView.findViewById(buttons[i]); 
     buttonNum.setOnClickListener(doSomething); 
    } 

private OnClickListener doSomething= new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      //doSomething 
    } 
}; 
0

Si usted quiere hacer menos código de clic oyentes que tiene este lib [http://jakewharton.github.io/butterknife/]

sólo tienes que hacer esto

@OnClick({ R.id.button1, R.id.button2, R.id.button3 }) 
public void doSomething(View button) { 
    //do whatever you want 
    button.changeWhateverInTheView(); 
} 
Cuestiones relacionadas