2017-09-27 1 views
1

Ich habe ein base Modul und ein Funktionsmodul namens query Modul in meinem Instant App-Projekt.Die Verwendung von im Basismodul des Feature-Moduls definierten Farben schlägt fehl, nachdem die Android Instant App neu erstellt wurde

Meine QueryActivity innerhalb query Modul verwendet Farben, die in base Modul sind.

QueryActivity.kt:

@ColorInt 
val textColor: Int = when (resultCode) { 
    FetchAddressIntentService.RESULT_SUCCESS -> android.R.color.white 
    FetchAddressIntentService.RESULT_FAILURE -> R.color.accent // this color is inside the base module 
    else -> R.color.accent // this color is inside the base module 
} 

Wenn ich run das Projekt versuchen, funktioniert es ohne Probleme in Ordnung. Aber wenn ich das Projekt rebuild, gibt es mir die folgende Fehlermeldung:

../net/epictimes/uvindex/query/QueryActivity.kt 
Error:(133, 63) Unresolved reference: color 
Error:(134, 27) Unresolved reference: color 

Unter Hinweis auf diese Farbwerte.

Ich löste dies, indem ich eine andere colors.xml Datei innerhalb des query Moduls hinzufüge und die base Farben davon referenziert. Es hat gut funktioniert. Sie können das Diff in this commit sehen.

<color name="query_location_success_text">@android:color/white</color> 
<color name="query_location_fail_text">@color/accent</color> 

Im Moment funktioniert es, aber ich bin mir nicht sicher warum. Ist das der richtige Weg? Meine Frage sollte nicht die Ressourcen innerhalb base Modul von den Feature-Modulen zugänglich sein?

Versionen:

Android target/compile SDK: 26

Kotlin: 1.1.50

Instant Apps: 1.1.0

Das ist ein Open-Source-Projekt von mir ist, können Sie here ganzes Projekt zu sehen.

Danke

Antwort

5

Ja, Ressourcen innerhalb Basismodul von der Featuremodule zugänglich sind, wenn Sie es mit den voll qualifizierten Namen (package_name.R.resource_name) verweisen.

Basis- und untergeordnete Module haben unterschiedliche Paketnamen (der Name des Basisfunktionspakets lautet net.epictimes.uvindex und der Name des Modulpakets lautet net.epictimes.uvindex.query).

Jedes Paket enthält einen eigenen Satz von Ressourcen und die Ressourcen-IDs werden in separaten R-Paketen während der Kompilierung gesammelt:

  • net.epictimes.uvindex.R - für Ihr Basis-Feature-Modul
  • net.epictimes.uvindex.query.R - für Feature-Modul

Verwenden Sie net.epictimes.uvindex.R.color.accent Bezeichner:

, um auf eine "Akzent" -Farbressource eines Basisfeatures von Ihrem Query-Feature-Modul zuzugreifen

FetchAddressIntentService.RESULT_FAILURE -> net.epictimes.uvindex.R.color.accent

+0

Das Ressourcenmanagement mit Instant-Apps ist in diesem Moment völlig fehlerhaft. Es ist derzeit ein nicht praktikables Stück ... Lint beschwert sich nicht über falsch verwendete R.x-Anweisungen. In vielen Fällen sind Ressourcen nur vom Basismodul verfügbar. mit innerhalb eines Feature-Moduls wird alles brechen, wenn das Include aus dem Basismodul abgerufen werden soll. Und wir haben nicht über die vollständige Zerstörung gesprochen, wenn Sie Proguard verwenden, das keine Querabhängigkeiten zwischen Modulen erkennen kann. –

+0

Sie haben Recht. Jedes Modul erzeugt sein eigenes R.java und das Problem hier ist, dass ich die falsche R-Datei referenzierte. Danke für Ihre Hilfe. Aber ich finde es komisch, dass "run" funktioniert, aber "rebuild" scheitert mit dem ungelösten Referenzfehler. –

Verwandte Themen