2015-04-01 31 views
21

Ho un'attività che gonfia una vista quando una richiesta web è finita. Alcuni dei widget di questo punto di vista deve essere collegato a una onClick metodo, quindi non ho:@OnClick array con ID facoltativi (ButterKnife)

@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

Come R.id.inflated_bt1 e R.id.inflated_bt2 non esistono quando si crea l'applicazione, viene generata un'eccezione che suggerisce di impostare un Annotazione @Optional.

La vista richiesta 'inflated_bt1' con ID XXXXXXXX per il metodo 'onClick' non è stata trovata. Se questa vista è facoltativa, aggiungere l'annotazione '@Optional'.

C'è un modo per impostare alcune delle viste con l'annotazione @Optional e iniettarle quando la visualizzazione viene gonfiata? O c'è un altro modo per farlo?

Grazie

risposta

18

La risposta corretta è quella di utilizzare il @Nullable annotazione. Vedi lo Butterknife home page. Esempio di utilizzo:

import android.support.annotation.Nullable; 

@Nullable 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() { 
    // TODO ... 
} 

EDIT:

L'anno da quando ho scritto questa risposta ed è stato accettato, la documentazione butterknife cambiato, e l'attuale metodo preferito per realizzare questo è di usare il @Optional annotazioni . Poiché questa è la risposta accettata, ritengo importante aggiornarla per affrontare la pratica corrente. Per esempio:

import butterknife.Optional; 

@Optional 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() { 
    // TODO ... 
} 
+0

Secondo la pagina github di ButterKnife, 'aggiungi un'annotazione @Nullable ai campi o l'annotazione @Optional ai metodi' http://jakewharton.github.io/butterknife/ – TheoKanning

+3

@TheoKanning Hai seriamente sottovalutato la mia risposta? I documenti sono cambiati. Non c'era un "Optional" quando ho risposto a questo _over un anno fa_. Se la risposta necessita di aggiornamento, aggiornala! – AutonomousApps

36

Basta aggiungere @Optional annotazione sulla parte superiore del tuo metodo, come è mostrato nel seguente codice:

@Optional 
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

c'è un caso in cui non si ha R.id.inflated_bt1 nel xml di layout che usi sul tuo Activity. Per casi come questo devi usare l'annotazione @Optional.

Quando si utilizza solo @OnClick annotazione nei YourClass$$ViewInjector codice sorgente si presenta come di seguito:

view = finder.findRequiredView(source, 2131230789, "method 'onClick'"); 
view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() { 
    @Override public void doClick(
     android.view.View p0 
    ) { 
     target.onClick(); 
    } 
    }); 

e il metodo findRequiredView tiri IllegalStateException quando vista è null.

Ma quando si utilizza inoltre @Optional annotazione, il codice generato assomiglia sotto

view = finder.findOptionalView(source, 2131230789); 
if (view != null) { 
    view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() { 
     @Override public void doClick(
     android.view.View p0 
    ) { 
     target.onClick(); 
     } 
    }); 
} 
+0

Come posso utilizzare ButterKnife.Finder? JavaDoc mostra un messaggio "NON UTILIZZARE" e non riesco a crearlo: "non può ereditare dalla classe finale butterknife.ButterKnife.Finder" –

+0

Perché vuoi utilizzare in tal modo la classe? –

2
@Nullable 
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

Se si include annullabile come detto da documenti butterknife e anche da @AutonomousApps allora si può comprendere come possono come ID anche se non stanno usando loro tutto il tempo.

Ricordare di includere la libreria di supporto delle annotazioni se non si utilizza la libreria appcompact. Controlla questo link Support Annotations

Problemi correlati