2014-06-13 15 views
7

Uso uno switch di versione per supportare versioni precedenti di Android.Come sopprimere l'avviso di Lint specifico per la funzione Android deprecata?

int sdk = Build.VERSION.SDK_INT; 
if (sdk < Build.VERSION_CODES.HONEYCOMB) { 
    ColorDrawable colorDrawable = new ColorDrawable(shapeColor); 
    //noinspection deprecation 
    viewHolder.shape.setBackgroundDrawable(colorDrawable); 
} else { 
    viewHolder.shape.setColor(shapeColor); 
} 

Quando costruire il progetto con Gradle dalla riga di di comando il seguente avviso viene emesso da Lint:

app/src/main/java/com/example/MyApp/CustomListAdapter.java:92: warning: 
[deprecation] setBackgroundDrawable(Drawable) in View has been deprecated 
      viewHolder.shape.setBackgroundDrawable(colorDrawable); 
          ^

Posso annotare la linea o metodo specifico per disattivare l'allarme (da quando lo faccio apposta)? Faccio non desidera disabilitare tutti gli avvisi.

+0

Si sta utilizzando Android Studio? – MrEngineer13

+0

@ MrEngineer13 Sì. Ma qui sto costruendo dalla riga di comando tramite './gradlew clean assembleDebug assembleRelease'. – JJD

+0

Cosa succede quando posizioni il cursore su viewHolder.shape.setBackgroundDrawable (colorDrawable); e premi Alt + Invio? – MrEngineer13

risposta

2

È necessario creare un file lint.xml per indicare cosa ignorare.

http://tools.android.com/tips/lint/suppressing-lint-warnings vedono questo per maggiori dettagli

vostro potrebbe apparire un po 'come questo

<?xml version="1.0" encoding="UTF-8"?> 
<lint> 
    <!-- Disable the given check in this project --> 
    <issue id="Deprecation"> 
     <ignore path="app/src/main/java/com/example/MyApp/CustomListAdapter.java" /> 
    </issue> 
</lint> 

Per gestire questo nella fonte si dovrebbe usare qualcosa di simile

@SuppressLint("Deprecation") 
+0

Non voglio disabilitare tutti gli avvisi di deprecazione. Preferirei aggiungere un'annotazione Lint alla riga specifica nel codice. – JJD

+0

Il link copre quello. @SuppressLint ("Deprecation") in linea. – bestdayever

+2

Ho provato '// noinspection AndroidLintDeprecation' come suggerito nella documentazione, ma l'avviso appare ancora. Non sono sicuro di cosa si intenda per ** id **. Il 'lintId' viene estratto come si può vedere [qui] (https://android.googlesource.com/platform/tools/adt/idea/+/jb-mr2-dev/android/src/org/jetbrains/android/ inspections/lint/SuppressLintIntentionAction.java), riga 169. - '@SuppressLint (" Deprecation ")' può essere impostato solo a livello di metodo se ho capito bene. – JJD

4

mi sono imbattuto in un problema simile In primo luogo ho ottenuto un avviso del compilatore:

:compileDebugJava 
Note: /path/file.java uses or overrides a deprecated API. 
Note: Recompile with -Xlint:deprecation for details. 

Quale è possibile sopprimere con @SuppressWarnings("deprecation") o semplicemente ignorarla in quanto si tratta di un avvertimento e non causare il build sicuro. Inoltre ho ottenuto l'errore di lanugine (dettagli nella build/lint-results.html):

Call requires API level 13 (current min is 9) 

Questo potrebbe essere soppresso con l'aggiunta di @SuppressLint("NewApi"). In alternativa, è possibile utilizzare @TargetApi(13) per suggerire che il metodo/classe potrebbe utilizzare metodi che dipendono dalla versione 13 dell'API, anziché da ciò che è stato impostato come minSdkVersion (ad esempio 9).

Le annotazioni possono essere eseguite solo a livello di classe o funzione, non per una singola riga. Si noti inoltre che la "deprecazione" non deve essere maiuscola, mentre ciò non sembra avere importanza per "NewApi".

6

Basta qualcosa di nuovo: Non sono sicuro di Android Studio, ma, per rimuovere questo avviso da questa linea, è possibile utilizzare:

//noinspection deprecation 

questo elimina l'avvertimento dalla riga successiva. es:

//noinspection deprecation 
e.setBackgroundDrawable(editTextDrawable); 

Non mostrerà un errore. Tuttavia, come ha detto @JJD, questo restituisce comunque l'avviso alla console. Ma almeno puoi avere un bel codice senza errori che può essere utile come per Git, ad esempio. E questo previene il problema con @SupressWarnings, che ignora tutti gli avvisi nel metodo. Quindi se hai qualcosa di deprecato di cui non sei a conoscenza, @SupressWarnings lo nasconderà e non sarai avvisato.Questo è il vantaggio del //noinspection

1

ho notato che l'annotazione @SuppressLint("deprecated") linea non sarà raccolto più - mentre @SuppressWarnings("deprecation")è essere raccolti.

è possibile disabilitare i controlli Deprecation per l'lintero Gradle con lintOptions all'interno del file a livello di modulo build.gradle; mentre non v'è alcuna possibilità di definire i singoli file così:

android { 
    lintOptions { 
     disable 'Deprecation' 
    } 
} 

o su può assegnare uno piuttosto dettagliato file di configurazione lint.xml con LintOptions:lintConfig (quando le impostazioni showAll true, sarà ancora mostrare le avvertenze - non importa l'XML fornito configurazione):

android { 
    lintOptions { 
     lintConfig file("lint.xml") 
     showAll false 
    } 
} 

dove si possono aggiungere singoli file, aggiungendo le loro strade:

<?xml version="1.0" encoding="UTF-8"?> 
<lint> 
    <issue id="Deprecation" severity="Error"> 
     <ignore path="app/src/main/java/com/example/MyApp/CustomListAdapter.java" /> 
    </issue> 
</lint> 

Il codice sorgente di com.android.builder.model.LintOptions potrebbe spiegare, cosa accade effettivamente lì (e conferma circa il 50% di ciò che ho scritto).

al fine di eliminare gli avvisi in linea in Android Studio ... che linter sembra essere un altro linter - e queste annotazioni non influenzano il linter della build Gradle (potrebbe essere necessario usarlo in combinazione con uno delle procedure di cui sopra, al fine di ignorare noti classi obsoleti e metodi):

//noinspection deprecation 

aggiornamento le Studio Android 2.3 note di rilascio parlare di una nuova funzionalità:

Lint Baseline: Wi su Android Studio 2.3, puoi impostare avvisi di sfilacciamento non risolti come riferimento nel progetto. Da quel momento in poi, Lint segnalerà solo nuovi problemi. Ciò è utile se nella tua app ci sono molti problemi legati ai lint, ma vuoi concentrarti solo sulla risoluzione di nuovi problemi. Ulteriori informazioni sulla linea di base di Lint e il nuovo Lint controlla le annotazioni & aggiunte in questa versione.

here è spiegato come creare un panno avvertimenti baseline - che registra le avvertenze rilevati in un file XML e poi li silenzia (che è il modo di meglio che avere le annotazioni codice inline, distribuito in tutto il luogo) ; Suppongo che le opzioni lintConfig e baseline debbano essere combinabili (in base ai requisiti).

android { 
    lintOptions { 
     baseline file("lint-baseline.xml") 
    } 
} 
+0

Io ** non ** voglio disabilitare ** tutti ** avvertimenti. – JJD

+0

@JJD lo ha spiegato meglio ora; in pratica si devono configurare due linters (quello di Android Studio, che lintiva dal vivo - e quello di Gradle, che si allaccia al momento della compilazione) - per disattivare tutti gli avvisi che non interessano. –

+0

Quando metto il tuo 'lint.xml' (con il mio percorso di classe) nella cartella principale del progetto allora ** Gradle continua a notificare ** che la classe" usa o sovrascrive un'API deprecata "quando esegue una compilazione sul comando linea. Inoltre, escludere l'intera classe è un po 'eccessivo dato che voglio solo ** tacitare la deprecazione per una singola linea o funzione **. – JJD

Problemi correlati