¿Cómo se activa el método onClick cuando un usuario hace clic en una vista, OnclickListener es una interfaz correcta? No define cómo funciona un método.

Entiendo que le da al programador la libertad de definir sus propias acciones cuando se invoca el método onClick, pero ¿cómo se invoca ese método cuando un usuario hace clic en una vista? ¿Y cómo funciona cuando hay varios métodos en una interfaz ?

Entiendo que es más una pregunta básica de Java que una pregunta de Android. Pero realmente he tenido esta duda durante mucho tiempo. Hope de alguna manera me explica cómo funciona.

     public interface OnClickListener 
     {         
     /**          
      * Called when a view has been clicked.          
      *          
      * @param v The view that was clicked.
      */         
     void onClick(View v);
     }
0
Nobody 24 dic. 2016 a las 19:02

3 respuestas

La mejor respuesta

Tenía la misma pregunta cuando comencé a aprender Android. No llama directamente al método Click cuando se presiona el botón. Android hace todo en la parte posterior. Cuando llamamos por primera vez a setOnclickListener, se configurará el oyente de información. Aquí tienes el código fuente del método setOnClickListener.

 public void setOnClickListener(OnClickListener l) 
 {
     if (!isClickable()) 
    {

         setClickable(true);
     }
     getListenerInfo().mOnClickListener = l;
 }

Y tenemos un método performAccessibilityActionInternal que se llama cuando presionamos la pantalla y si la acción fue hacer clic llamará al método performClick y este método perfromClick llamará al método onClick del oyente Aquí está el método performClick

public boolean performClick() {
     final boolean result;
     final ListenerInfo li = mListenerInfo;
     if (li != null && li.mOnClickListener != null) {
         playSoundEffect(SoundEffectConstants.CLICK);
         li.mOnClickListener.onClick(this);
         result = true;
     } else {
         result = false;
     }

     sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
     return result;
   }

Para obtener más información, consulte el código fuente abierto de Android aquí

0
Yirga 24 dic. 2016 a las 17:22

Es un mecanismo de devolución de llamada. U necesita definir una clase concreta que implemente la interfaz OnclickListener. Eso es lo que haces cuando configuras OnClickListener en la vista de esta manera

Button button = (Button) findViewById(R.id.button_id);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Perform action on click   
                }
            });

Está definiendo una clase interna anónima que implementa OnClickInterface. También puede definir otra clase personalizada que implemente OnClickInterface y simplemente establecer esa clase en setOnClickListener.

Cuando configura el oyente, para comprender, puede visualizar que ese botón tendrá una referencia a su clase dentro de él

Eg:

public class Button extends TextView {
     OnClickInterface mCallBack;

     void setOnClickListener (OnClickInterface in) {
       mCallBack = in;
     }
     void clicked(){
      in.onClick(this);
     }
}

Cada vez que se hace clic en el botón, solo llama al método onclick de la implementación de su interfaz y le da la vista

Espero eso ayude

0
Aditya K 24 dic. 2016 a las 16:29

Una interfaz en Java es un contrato, contiene firmas de métodos que las clases que desean respaldar el contrato tienen que implementar.

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

Una clase que implementa OnClickListener tiene que implementar el método onClick(View v). por ejemplo -

public class LogListener implements OnClickListener
{              
    private final Logger logger;

    LogListener(Logger logger) { this.logger = logger; }

    void onClick(View v) { logger.log("View Clicked!"); }
}

No se puede construir una interfaz, solo puede hacer referencia a una instancia de una implementación de la interfaz:

OnClickListener listener = new LogListener(logger);

Cuando se llama a listener.onClick, la implementación del objeto referenciado se obtiene en tiempo de ejecución, en este caso LogListener.onClick.

Android Framework desea admitir una forma en que las vistas alertarán de que se ha hecho clic para que el programador pueda manejar los clics, por lo que proporcionan un método setOnClickListener que obtiene cualquier objeto que implemente OnClickListener mantiene una referencia a él, y cuando se hace clic en el botón, se llama al método onClick.

Este patrón se llama Observer Pattern.

0
ori 24 dic. 2016 a las 16:31