2012-03-14 15 views
5

yo soy un principiante para Android, mientras que la creación onclick oyente a un botón, lo que hace el parámetro pasado media:Android setOnclicklistener parámetro

btn1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    });  

así, "nueva OnClickListener()" se pasa a un método entonces, ¿no debería ser eso un objeto?
si no es un objeto; entonces, ¿cómo usamos la palabra clave "nueva"?
por qué se llama directamente a "onclick()" sin utilizar la palabra clave "this" ni su nombre de clase.

+0

Hola odo estamos pasando un objeto como una argumento.Básicamente estamos creando una clase interna que anula el método onClick. –

Respuesta

0

OnClickListener()

es una interfaz. Con la nueva palabra clave está declarando un nuevo objeto de una clase interna anónima que implementará la interfaz. Eso es cuestión de base para

java

de androide. Debería considerar leer sobre

interfaz Java

12

OnClickListener es un interface y mediante el uso new OnClickListener() como parámetro para btn1.setOnClickListener En realidad, es creando una Anonymous Inner Class que implementa OnClickListener . Y el método onClick debe ser declarado porque es un método abstracto dentro de esa clase de interfaz. Cualquier código que escriba dentro de Click se ejecutará cuando se presione el botón.


actualización

hacerlo utilizando la clase interna anónima en un objeto:

//declaring OnClickListener as an object 
private OnClickListener btnClick = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
}; 

//passing listener object to button 
btn1.setOnClickListener(btnClick); 

para hacerlo sin necesidad de utilizar la clase Anónimo:

public class YourActivity extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Button b = new Button(this); 

     //setting listener to button 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
} 

La única diferencia entre estos enfoques es, si su botón contiene clic código de evento que se supone que es válido/disponible solo para ese botón, entonces puede usar la clase interna como lo hace en su código (porque es fácil hacerlo de inmediato). Sin embargo, si hay varios botones que requieren que se ejecute el mismo código en el evento onClick, entonces puede definir listener como un objeto y pasárselo.

+0

¿hay alguna manera de agregar onlcick oyente que no sean clases anónimas? ¿Puedo declararlo fuera de la firma del método y solo pasar el objeto? dame la muestra del código por favor. –

+0

sí, claro. revise mi respuesta actualizada – waqaslam

+0

Aún así, una clase interna anónima :) –

0

OnClickListener es una interfaz. Significa que si lo pones en línea, has creado una clase anónima que solo está implícita en la interfaz dentro del método set.

Si desea crear una clase OnClick.Se podría hacer algo como esto:

class OnButtonClick implements OnClickListener{ 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
    } 

} 

continuación, puede utilizar:

OnButtonClick obc = new OnButtonClick(); 
textView.setOnClickListener(obc); 

Esto es más de Java de androide, Lea sobre Interfaces y Clases Internas

1

definición de interfaz para una devolución de llamada a ser invocado cuando se hace clic en una vista.

abstract void onClick (Ver v) Se invoca cuando se hace clic en una vista.

2

Para instanciar un objeto de una interfaz o una clase abstracta, debe sobrescribir todos sus métodos no implementados (métodos abstractos). Puede anular los métodos abstractos utilizando una clase anónima o definiendo una clase que amplíe la clase abstracta/implemente la interfaz y anule los métodos abstractos. Sin embargo, para hacerlo más claro, puede hacerlo de esta manera:

OnClickListener l = new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
}); 
btn1.setOnClickListener(l); 

y utilizar una clase separada, puede hacerlo de esta manera:

btn1.setOnClickListener(new MyOwnListener()); 

// ... 

public class MyOwnListener implements OnClickListener 
{ 
    // ... 

    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
} 
Cuestiones relacionadas