2012-03-01 9 views
8

Ho appena trovato questo interessante messaggio dal compilatore e non so perché sta succedendo. Qui è il casoLa trasmissione al pulsante è ridondante - Perché?

Esempio 1.

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

Esempio 2.

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

Nel primo esempio, devo lanciare un oggetto restituito da findViewById a Button. Nel secondo esempio, non è necessario eseguire il cast dell'oggetto restituito perché non ho utilizzato un altro oggetto di classe Button. Se provo a lanciarlo tramite

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

mi metterò l'avvertimento Casting findViewById(R.id.someButtonId) to Button is redundant.

Perché sta succedendo? Non sto cercando di rimuovere l'avviso cast. Voglio che lo conosca la logica alla base di questo e perché la trasmissione non sia necessaria se non provo a inizializzare un altro oggetto con l'oggetto restituito da findViewById.

+0

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

+0

@Samir so come rimuoverlo :). Non ne ho bisogno. Sto chiedendo ** perché ** il casting non è necessario. – sandalone

+0

:(non ricevo l'avviso – Triode

risposta

6

Il motivo per cui si ottiene questo è dovuto al fatto findViewById rendimenti View e questa classe definisce già il metodo setOnClickListener. Ciò significa che anche senza fare il cast è possibile impostare l'ascoltatore. Quindi il tuo cast è ridondante.

+0

Per chiedere anche qui: è sicuro usarlo come in examp2? – sandalone

+1

È perfetto come l'Esempio 2. –

+0

Perché pensi che non sarebbe sicuro? –

2

Il findViewById() restituisce sempre vista che è madre di tutte le viste, come ImageView, pulsante ...

Il setOnClickListener è un metodo di vista di classe. In questo modo puoi catturare gli eventi click semplicemente senza lanciarli su Button. Penso di sì che solo dice ridondante.

0

Sto indovinando setOnClickListener() è un metodo nella vista piuttosto che il pulsante, e quindi sì: il cast è ridondante.

2

Il motivo è che nell'esempio 1 è necessario trovare un pulsante esplicitamente perché lo si assegna a una variabile Button.

OnClickListener è per qualsiasi tipo di visualizzazione, quindi non è necessario eseguire il cast in una sottoclasse specifica di View per impostare OnClickListener su di esso.

+0

È sicuro quindi usarlo come nell'esempio 2 ?? ? – sandalone

+1

Assolutamente. Qualunque View si trovi nell'esempio 2, su di esso può essere impostato un OnClickListener. –

+1

Lo saprai comunque che è un pulsante, perché non usi l'id someButtonId per nessun altro Views, vero? –

1

Sta succedendo perché non c'è bisogno di lanciare View-Button per chiamare setOnClickListener che è definita in View. E 'abbastanza per fare findViewById(R.id.someButtonId).setOnClickListener(this);

Problemi correlati