In uno dei nostri metodi, utilizziamo smoothScrolling in una visualizzazione elenco. Poiché questo metodo non è disponibile prima dell'API Livello 8 (FROYO), abbiamo utilizzato l'annotazione TargetApi per impedire che il metodo venga richiamato nelle precedenti versioni dell'SDK.TargetApi non preso in considerazione
Come potete vedere, abbiamo do utilizzare l'annotazione TargetApi sia nella definizione della classe che nelle istruzioni che utilizzano gli oggetti della classe. Questo è più del necessario.
Il nostro problema è che l'annotazione TargetApi non viene presa in considerazione e rende il nostro emulatore bloccato nella versione ECLAIR (SDK 7). Tracciando, ci rendiamo semplicemente conto che il codice che dovrebbe essere eseguito solo nelle versioni 8+ viene eseguito anche nella versione 7.
Manca qualcosa?
Questo codice è in un ascoltatore:
@TargetApi(8)
private final class MyOnMenuExpandListener implements OnMenuExpandListener {
@Override
public void onMenuExpanded(int position) {
doScrollIfNeeded(position);
}
@Override
public void onMenuCollapsed(int position) {
doScrollIfNeeded(position);
}
protected void doScrollIfNeeded(int position) {
if (mListViewDocuments.getLastVisiblePosition() - 2 < position) {
mListViewDocuments.smoothScrollToPosition(position + 1);
}
}
}
e l'ascoltatore è registrato in questo modo:
@TargetApi(8)
private void allowSmothScrollIfSupported() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
//This if should not be necessary with annotation but it is not taken into account by emulator
Log.d(LOG_TAG, "Smooth scroll support installed.");
folderContentAdapter.setOnMenuExpandListener(new MyOnMenuExpandListener());
}
}
A proposito, abbiamo eseguire il codice in modalità debug, in modo che il problema non è legato alla offuscamento rimozione annotazioni.
BTW, è possibile scrivere '@TargetApi (Build.VERSION_CODES.FROYO)' invece di '@TargetApi (8)'. – Wyzard
Hai ragione. E per questo il tuo target SDK deve essere il più alto possibile. – Snicolas