2011-06-02 14 views
13

En mi aplicación para Android no creo un manejador de visitas con vista en el código, pero confío en la capacidad de especificarlo en el archivo de diseño XML, como esto:Android Proguard: cómo mantener los manejadores de OnClick referenciados únicamente desde diseños XML

<Button 
     .... 
     android:onClick="onSearchClicked" 
     ...../> 

y luego tener el método de la Actividad de la siguiente manera:

public void onSearchClicked(View v) { 
    ........} 

decir, no hay referencia obvia a este método en mi propio código.

Al ejecutar Proguard para una versión de producción, parece que se elimina este método y se produce un error al hacer clic.

¿Qué puedo agregar a mi archivo de configuración proguard para evitar esto que no me obligue a cambiar el nombre de todos estos métodos?

  • Una anotación ¿Podría agregar al método y tener en cuenta a proguard?
  • ¿De alguna manera especifique este tipo de métodos a los que se hace referencia desde xml?
  • Supongo que puedo agregar una referencia falsa en el código, pero me gustaría evitar eso si puedo ya que no siempre recordaré ponerlo.

He revisado los ejemplos de proguard para Android y no puedo ver nada para esta necesidad en particular.

+0

vez más. No hay respuesta directa que se ajuste a la factura, y no puedo votar por mi propia respuesta que sí lo haga. –

Respuesta

22

Ésta parece ser la mejor respuesta, ya que es 100% resistente a la denominación de tales métodos:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed 
-keepclassmembers class * extends android.app.Activity { 
     public void *(android.view.View); 
} 

espero que ayuda

+0

Agregué el código anterior pero sigo obteniendo 'java.lang.IllegalStateException: No se pudo ejecutar el método de la actividad' –

+1

¿Es público y coincide con la firma del método requerida para los manejadores onClick? –

+0

Gracias por su respuesta. Sí, era público, pero encontré que el problema estaba relacionado con otra función llamada en OnClick. Por lo tanto, no te preocupes. –

1
-keepclasseswithmembers class * { 
    public void onSearchClicked(android.view.View); 
} 

pero comprueba que desde Proguard doc: http://proguard.sourceforge.net/index.html#/manual/refcard.html

+0

Pensé en eso, pero en una Actividad puedo tener un lof de estos, todos con diferentes nombres. Y cualquier cambio en mi código requerirá un cambio en mi configuración proguard ... Estoy buscando una forma más robusta. –

1

que utilizo:

-keepclassmembers class * extends android.app.Activity { 
     public void on*Click(android.view.View); 
} 

y luego I Nombre todos los métodos onClick como: onCancelBtnClick(), onBackgroundClick(), etc.

Cuestiones relacionadas