Android-Ressourcen-IDs plötzlich nicht endgültig, switch() ist kaputt

Lesezeit: 4 Minuten

Benutzeravatar von Seva Alekseyev
Sewa Alexejew

PRÄAMBEL: Diese Frage ist ziemlich veraltet, sie wurde geschrieben, als die bevorzugte Android-Entwicklungsumgebung Eclipse mit dem Android-Plugin war.


Ich hatte eine Zeit lang ein Java-Android-Projekt. Heute habe ich die Android-Entwicklungstools auf die neuesten von Google aktualisiert. Und das Projekt ist kaputt gegangen – ich bekomme eine Reihe von Kompilierungsfehlermeldungen “Case-Ausdrücke müssen konstante Ausdrücke sein”.

Es stellt sich heraus, dass die R.java-Datei jetzt anders generiert wird. Früher hätte es eine Menge

public static final int MyID=0x12340000;

Aussagen; Jetzt sieht es (nach einer Reinigung / Neuaufbau) so aus:

public static int MyID=0x12340000;

final ist weg. Also sind alle Schalter für Ressourcen-IDs, die ich hatte (und ich hatte ein paar), falsch. Was ist bitte passiert? Bin es nur ich? Was ist hier die Begründung? Ist das irgendwo dokumentiert? Kann ich bringen final irgendwie zurück?

Dies geschah ungefähr gestern, als das SDK/ADT 14 veröffentlicht wurde:

Ab ADT 14 sind Ressourcenkonstanten in Bibliotheksprojekten nicht mehr endgültig. Näher erläutert wird dies in http://tools.android.com/tips/non-constant-fields

Ab ADT 14 ist ein Quickfix verfügbar: http://tools.android.com/recent/switchstatementconversion

Um aus der Begründung zu zitieren:

Wenn mehrere Bibliotheksprojekte kombiniert werden, könnten die tatsächlichen Werte der Felder (die eindeutig sein müssen) kollidieren. Vor ADT 14 waren alle Felder endgültig, sodass alle Bibliotheken bei jeder Verwendung alle ihre Ressourcen und den zugehörigen Java-Code zusammen mit dem Hauptprojekt neu kompilieren mussten. Dies war schlecht für die Leistung, da es Builds sehr langsam machte. Es verhinderte auch die Verbreitung von Bibliotheksprojekten, die den Quellcode nicht enthielten, wodurch der Nutzungsbereich von Bibliotheksprojekten eingeschränkt wurde.

Der Grund, warum die Felder nicht mehr final sind, liegt darin, dass die Bibliotheks-Jars einmal kompiliert und direkt in anderen Projekten wiederverwendet werden können. Dies ermöglicht nicht nur die Verteilung von Binärversionen von Bibliotheksprojekten (kommt in r15), sondern sorgt auch für viel schnellere Builds.

  • Eigentlich sinnvoll. Ich sehe, woher sie kommen. Die Tatsache, dass Android-Bibliotheken nur verlinkte Quellen waren, im Gegensatz zu kompilierten Bibliotheken, war für mich seit einiger Zeit ein kleiner Schmerzpunkt. Außerdem ein großes Lob an Google für die Bereitstellung eines magischen Refactorers.

    – Seva Alexejew

    20. Oktober 2011 um 19:27 Uhr

  • Dies ist nur die Folge einer idiotischen Designentscheidung des Android-Teams. Wann immer Sie eine generierte Datei mit einem Haufen magischer Zahlenkonstanten sehen, sollten Sie sich das komisch ansehen. Vielen Dank, Google, dass Sie aufgrund fehlender Voraussicht einen Haufen Quellcode Ihrer Entwickler geknackt haben. Öffentliche statische Ints. Viel besser?!

    – Nate

    12. November 2011 um 1:15 Uhr

  • Diese Antwort ist als Lösung markiert – aber ich sehe sie nicht … Nur sehr nette Diskussionen, Vorschläge, Dokumentationslinks usw. … Was ist eine konkrete Lösung? Was sollte ich in meinem Code ändern, um das Problem zu beheben – bitte in ein paar Worten? Oder keine Lösung? – dann antworten Sie bitte in einem Wort: “nein”. ?

    – Witali

    25. Dezember 2020 um 5:56 Uhr


  • @RussiaDroneFlights Hast du einen der Links gelesen? Sie sagen, dass Sie If-Else-Klauseln anstelle von Switch-Anweisungen verwenden sollten, wenn Sie etwas bedingt mit Ressourcen-IDs tun müssen. Switch-Anweisungen würden erfordern, dass die IDs endgültig sind, was sie seit etwas mehr als neun Jahren nicht mehr sind.

    – Philipp Reichart

    26. Dezember 2020 um 11:40 Uhr

Fügen Sie einfach Klammern hinzu:

switch (view.getId()) {
    case (R.id.view1):
        break;
    case (R.id.view2):
        break;
}

  • Warum funktioniert das? Und ist es sicher zu tun?

    – SMBiggs

    5. Dezember 2022 um 22:49 Uhr

  • @SMBiggs Ich denke, es macht es zu einer Art Konstante, nicht nur zu einer Referenz. Ich benutze es einige Monate im Produktionsmodus bei vielen Kunden und habe noch keinen Absturz oder eine Beschwerde bekommen.

    – M.Marmor

    6. Dezember 2022 um 9:54 Uhr


Benutzeravatar von AP
AP

Sie könnten zur Verwendung von If/Else-Anweisungen wechseln und die Warnung verschwindet.

Probe:

    @Override
    public void onClick(final View v) {
        //finds which button was pressed
        final int buttonView = v.getId();
        String current = fromEditText.getText().toString();
        if (buttonView == R.id.bA) {
            current += getString(R.string.a);
        } 
  }

  • 😂😭🤣😀❤️ Gut!

    – EINER

    11. November 2020 um 18:12 Uhr

Google empfiehlt Ihnen die Verwendung if/else-Bedingungen

http://tools.android.com/tips/non-constant-fields

Um sie automatisch zu ändern, können Sie das Caretzeichen auf setzen switch Schlüsselwort und drücken Sie Alt + Eintreten unter Windows (Möglichkeit + Eintreten auf Mac) und wählen Sie aus Ersetzen Sie ‘switch’ durch ‘if’

Du solltest benutzen Bindung ansehen!

android {
    ...
    viewBinding {
        enabled = true
    }
}

  • Funktioniert nicht mit Menüs. Die ursprüngliche Frage bezog sich hauptsächlich auf Menü-IDs.

    – Seva Alexejew

    19. Mai 2021 um 20:33 Uhr

  • Fügt viele Klassen hinzu und behebt das Problem nicht wirklich, sondern verwendet nur eine andere Methode zum Identifizieren und Arbeiten mit Ansichten.

    – LordWabbit

    18. August 2021 um 19:24 Uhr

Fügen Sie dies einfach in Ihrer Modulebene hinzu build.gradle Datei:

android {
    ...
    lintOptions {
        disable 'NonConstantResourceId'
    }
}

Mehr:
https://developer.android.com/studio/write/lint#gradle

  • Funktioniert nicht mit Menüs. Die ursprüngliche Frage bezog sich hauptsächlich auf Menü-IDs.

    – Seva Alexejew

    19. Mai 2021 um 20:33 Uhr

  • Fügt viele Klassen hinzu und behebt das Problem nicht wirklich, sondern verwendet nur eine andere Methode zum Identifizieren und Arbeiten mit Ansichten.

    – LordWabbit

    18. August 2021 um 19:24 Uhr

1438790cookie-checkAndroid-Ressourcen-IDs plötzlich nicht endgültig, switch() ist kaputt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy