English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Problema di incompatibilità di versione dopo l'aggiunta di fragment in Android

La generazione e la presentazione di Fragment

Android esegue su una vasta gamma di dispositivi, dai telefoni con schermi piccoli, ai tablet con schermi ultra grandi persino ai televisori. Di fronte alle differenze di dimensione dello schermo, in molti casi, si sviluppa un'app per il telefono, poi si copia e si modifica la layout per adattarsi ai tablet e ai super grandi schermi. Non è possibile fare in modo che un'app possa adattarsi contemporaneamente sia ai telefoni che ai tablet? Certo, deve esserci. L'arrivo di Fragment è stato proprio per risolvere questo problema. Puoi considerare Fragment come una parte di un'interfaccia di Activity, persino l'interfaccia di Activity può essere composta interamente da Fragment. E più impressionante è che Fragment ha il proprio ciclo di vita e può ricevere ed elaborare eventi degli utenti, così non è necessario scrivere codice per la gestione degli eventi dei controlli all'interno di Activity. E più importante ancora, puoi aggiungere, sostituire e rimuovere un Fragment dinamicamente.

Ieri ho studiato i Fragment di Android. Seguendo la guida del sito ufficiale, ho creato una classe BlankFragment che eredita da Fragment. Poi, durante la compilazione, è sorto un errore:

Errore: esecuzione fallita per l'attività ':app:processDebugManifest'.
> Merge del manifest fallito: attributo meta-data#android.support.VERSION@value value=(26.0.0-beta1) da [com.android.support:design:26.0.0-beta1] AndroidManifest.xml:28:13-41
  è anche presente in [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35 value=(26.1.0).
  Suggerimento: aggiungi 'tools:replace="android:value"' all'elemento <meta-data> in AndroidManifest.xml:26:9-28:44 per sovrascrivere.

Ho cercato un po', ci sono molte cose dette. La meno affidabile è quella che dice di cambiare l'etichetta nel file manifest da android:name a class. Dai log è chiaro che ha a che fare con la versione! Alla fine ho trovato una soluzione compatibile con la versione, è necessario aggiungere il seguente codice nel file build.gradle nella directory app:

configurazioni.tutti {
  strategyRisoluzioneOgniDipendenza { DettagliRisoluzioneDipendenza dettagli ->
    def richiesta = dettagli.richiesta
    if (richiesta.gruppo == 'com.android.support') {
      if (!requested.name.startsWith("multidex")) {
        details.useVersion '26.0.0-beta1'
      }
    }
  }
}

Ho provato e funziona davvero. Ma non possiamo fermarci qui.

Notare che, proprio sopra questo pezzo di codice aggiunto, si descrivono le librerie di dipendenza del progetto:

dipendenze {
  implementazione fileTree(dir: 'libs', include: ['*.jar'])
  implementazione 'com.android.support:appcompat-v7:26.0.0-beta1'
  implementazione 'com.android.support.constraint:constraint-layout:1.0.2'
  implementazione 'com.android.support:design:26.0.0-beta1'
  implementazione 'com.android.support:support-v4:26.1.0'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'com.android.support.test:runner:0.5'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'
}

E questa riga sotto ha una linea rossa:

implementazione 'com.android.support:appcompat-v7:26.0.0-beta1'

Il mouse sopra indica:

Tutte le librerie com.android.support devono utilizzare la stessa specifica di versione esatta 
(la combinazione di versioni può portare a crash in esecuzione). 
Trovate versioni 26.1.0, 26.0.0-beta1. Esempi includono com.android.support:support-compat:26.1.0 
and com.android.support:animated-vector-drawable:26.0.0-beta1

Non è chiaro: tutte le librerie che dipendono da com.android.support devono utilizzare la stessa versione! Guarda la sezione Dependency, com.android.support:appcompat-v7:26.0.0-beta1 e com.android.support:support-v4:26.1.0 sono due versioni in conflitto. Guarda i record di git, la riga 26.1.0 è stata aggiunta di recente, sicuramente è stata aggiunta automaticamente da AndroidStudio quando è stato creato il BlankFragment. Torna a guardare il log di errore, non dice la stessa cosa?

Non posso fare a meno di lamentarmi di AndroidStudio, se vuoi aggiungere automaticamente la dipendenza di versione, perché non controlli anche la compatibilità della versione? Altrimenti, è meglio non aggiungerla, lasciaci farlo noi. Odio queste cose semi-automatizzate, sono davvero ingannevoli.

Inoltre, la sintassi del file gradle è anche interessante. I commenti sono nello stile C/C++, la dichiarazione delle funzioni è nello stile Python, e l'espressione Lambda è un po' come C#.

Sommario

Come descritto sopra, l'autore ha introdotto agli utenti i problemi di incompatibilità di versione dopo l'aggiunta di fragment in Android, sperando che possa essere utile agli utenti. Se avete qualsiasi domanda, lasciate un messaggio, l'autore risponderà tempestivamente. In questo senso, ringrazio anche tutti i sostenitori del sito web di yellol tutorial!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi proprietari, il contenuto è stato contribuito volontariamente dagli utenti di Internet e caricato autonomamente, il sito web non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito web rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare