2012-03-01 15 views
8

Acabo de encontrar este interesante mensaje del compilador y no sé por qué está sucediendo. Aquí es el casoCasting to Button es redundante - ¿Por qué?

Ejemplo 1.

Button test = (Button) findViewById(R.id.someButtonId); 
test.setOnClickListener(this); 

Ejemplo 2.

findViewById(R.id.someButtonId).setOnClickListener(this); 

En el primer ejemplo, necesito emitir un objeto devuelto por findViewById-Button. En el segundo ejemplo, no tengo que lanzar el objeto devuelto porque no usé otro objeto de clase Button. Si trato para su emisión a través de

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this); 

voy a conseguir la advertencia Casting findViewById(R.id.someButtonId) to Button is redundant.

¿Por qué sucede esto? No estoy tratando de eliminar la advertencia de lanzamiento. Quiero saber la lógica detrás de este y por qué no es necesario el lanzamiento si no intento inicializar otro objeto con el objeto devuelto por findViewById.

+0

http://stackoverflow.com/questions/3502690/remove-redundant-casts-in-java –

+0

@Samir Sé cómo eliminarlo :). No necesito eso. Pregunto ** por qué ** no es necesario el casting. – sandalone

+0

:(no obtengo la advertencia – Triode

Respuesta

6

La razón por la que recibe esto se debe a findViewById vuelve View y esta clase ya define el método setOnClickListener. Esto significa que incluso sin hacer el reparto puede configurar el oyente. Por lo tanto, tu elenco es redundante.

+0

Preguntar aquí también: ¿es seguro usarlo como en ejemplo2? – sandalone

+1

Es perfecto como el Ejemplo 2. –

+0

¿Por qué crees que no sería seguro? –

2

El findViewById() devuelve siempre Ver el cual es padre de todos los dictámenes como ImageView, botón ...

El setOnClickListener es un método de vista de clase. Para que pueda ver los eventos de clics simplemente sin enviarlo a Button. Creo que solo dice redundante.

0

Supongo que setOnClickListener() es un método en la Vista en lugar del Botón, y así sí: el reparto es redundante.

2

La razón para esto es que en el Ejemplo 1 necesita encontrar un Botón explícitamente porque lo está asignando a una variable Button.

OnClickListener es para cualquier tipo de vista, por lo que no es necesario convertirlo a una subclase de vista específica para establecer un OnClickListener en ella.

+0

¿Es seguro usarlo como en el ejemplo 2? ? – sandalone

+1

Absolutamente. Cualquiera que sea la Vista que se encuentre en el ejemplo 2, se puede establecer un OnClickListener en ella. –

+1

De todos modos sabrá que es un botón seguro, porque no usa el id algunaButtonId para otras vistas, ¿verdad? –

1

Está sucediendo debido a que no es necesario para echar a ViewButton con el fin de llamar setOnClickListener que se define en View. Es suficiente para hacer findViewById(R.id.someButtonId).setOnClickListener(this);

Cuestiones relacionadas