2012-09-12 23 views
5

estoy usando AspectJ con Android y estoy capturar correctamente las llamadas a View.setOnClickListener() con este aspecto:Captura View.setOnClickListener() define a través de XML

public aspect Test { 

    pointcut callPointcut(View view, OnClickListener listener) : call(void View.setOnClickListener(OnClickListener)) && target(view) && args(listener); 

    @SuppressAjWarnings // Exported advice 
    before(View view, OnClickListener listener) : callPointcut(view, listener) 
    { 
     Log.d("AspectJ", "Attempt to set onClick listener on view " + Integer.toHexString(view.getId())); 
     Log.d("AspectJ", "Aspect has executed."); 
     Log.d("AspectJ", listener.toString()); 
    } 
} 

Por desgracia, este no captura oyentes establecieron con en el diseño XML. ¿Hay alguna forma de capturar esto?

Respuesta

1

usted no será capaz de hacerlo de esa manera.

Si lo entiendo correctamente, escucha las llamadas de setOnClickListener() en Views.

Cuando configura el atributo onclick en xml, nunca se llama. El Oyente se establece cuando se crea la Vista, directamente. setOnClickListener() nunca se llama.

La única solución sería verificar todas sus vistas a mano, lo que no es recomendable y probablemente no sea lo que está buscando.

+0

No me molesta comprobar todas las vistas programáticamente, pero ¿cómo verificaría a los oyentes? No hay 'getOnClickListener()' (pero hay un 'getOnFocusChangeListener()' ...: P) – m0skit0

+1

Oh wow. Me pregunto por qué es así. Mi mal, pensé que había uno. Lo siento, no puedo ayudarte. No estoy familiarizado con aspectj, solo puedo decir que el onclicklistener se establece directamente al analizar el xml en el constructor de la vista (al inflar un diseño). Sin embargo, podría analizar el xml usted mismo, entonces al menos obtendría el nombre del método que se llama, pero no el objeto detector. Y probablemente sea mucho trabajo. –

+0

Sí, pensé en analizar el XML. Gracias por su respuesta :) – m0skit0

-5

Se puede utilizar,

<TextView 
      android:id="@+id/display_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="3dp" 
      android:onClick="testclick" 
      android:textSize="16sp" 
      android:textStyle="bold" > 

Añadir según API dentro de su actividad,

public void textclick(View v){ 

//TODO :anything you want 
} 
+1

Nada que ver con lo que estoy preguntando aquí. – m0skit0

1

No estoy 100% seguro de si esto funcionará, pero ¿por qué no modificar la clase View para tener un atributo mOnClickListener? Luego, cuando OnClickListener esté a punto de configurarse en la clase de Vista personalizada, configure el atributo como "new OnClickListener() {...}" y luego llame a setOnClickListener con el atributo. A continuación, agregaría un método público llamado getOnClickListener(), al que podría llamar en su objeto de Vista personalizado para devolver dicho oyente.

Esto puede ser una manera indirecta/tediosa, porque también necesitaría incluir no solo su clase de vista personalizada, sino cada subclase de vista que planea usar en su XML y cambiar sus superclases para usar su vista personalizada. no de Android. Luego, necesitaría cambiar sus elementos XML para reflejar eso, es decir, com.yourpackage.Button, etc.

+1

También pensé en esto, pero trabajar demasiado subclasificando cada vista de niños y también tener un desarrollador externo usar esta clase ... ¡El beneficio que obtengo de esto es demasiado bajo para un esfuerzo tan grande! Gracias por su respuesta de todos modos :) – m0skit0

Cuestiones relacionadas