2013-10-23 22 views
8

Ich kenne den Unterschied zwischen @+id und @id (siehe accepted answer). Allerdings habe ich immer das Gefühl, dass ich die Aufgabe des AAPT-Compilers mache, wenn ich das "+" in @+id schreibe.Warum ist es notwendig, @ + ID anstelle von @id zu verwenden?

Gibt es einen Grund, aus dem der Ressourcencompiler nicht selbst schließen kann, wenn ein Bezeichner erstellt oder einfach wiederverwendet werden muss? Eine zugrunde liegende Hashtabellenstruktur würde die Aufgabe erfüllen: Jede Ressource mit der gleichen ID wird in den gleichen Bucket geschrieben, und wenn der Schlüssel nicht existiert, erstellen Sie ihn einfach.

+0

http://stackoverflow.com/questions/5025910/difference-between-id-and-id-in-android - beziehen Sie sich – N20084753

+0

@ N20084753 Er erwähnte es bereits in der OP. – Piovezan

+0

@ N20084753 Das ist der Link, den ich im ersten Satz gab. Es erklärt den Unterschied, beantwortet aber nicht, warum das "+" nicht automatisch von AAPT eingegeben werden kann. –

Antwort

0

mit @ + ID Sie ID zu R.java hinzufügen, die Sie aus Java-Klassen verweisen können, während mit @id Sie nicht sind. Sie können @id nur verwenden, wenn eine bestimmte ID bereits erstellt wurde und Sie in einer anderen Ansicht darauf verweisen, z. android:layout_below="@id/some_id"

+1

Danke, aber wie gesagt, ich weiß das alles. Die Frage ist, warum das Plus-Symbol notwendig ist. Es sollte für den Compiler super einfach sein zu wissen, ob der Identifier bereits existiert oder nicht, also verstehe ich nicht, warum ich ihm diese Information geben muss. –

1

Wahrscheinlich könnte der Compiler nicht zwischen einer "richtigen" und einer "falschen" ID unterscheiden. Wenn es eine neue ID findet (d. H. Eine, die nicht in der zugrundeliegenden Hashtabelle enthalten ist), würde es immer annehmen, dass es sich um eine richtige neue ID handelt. Es wäre nicht in der Lage, zwischen einer tatsächlichen neuen ID und einer falsch eingegebenen ID zu unterscheiden.

+0

Vielleicht, aber das Ergebnis ist, dass viele Entwickler @ + ID überall verwenden, da es keinen Fehler gibt, wenn die ID bereits definiert ist, und alles funktioniert gut. Das heißt, der Compiler testet, ob die ID bereits existiert, aber nicht, wenn sie nicht existiert, das ist verrückt. –

1

Ich könnte mir vorstellen, dass es dem Programmierer helfen soll.

Wenn Sie die @ + ID-Konstruktion nicht benötigen, dann wären alle @id-Referenzen/Konstruktionen gültig, dann wäre es schwierig, einen Fehler zu finden, da der Compiler bei falschen Referenzen nicht fehlschlägt (wie es einfach wäre) konstruiere die Tippfehler-ID).

Anders ausgedrückt, müssten alle ID-Referenzfehler zur Laufzeit erkannt werden.

Edit:

bemerkt einfach die ähnliche Antwort von Piovezan, in Bezug auf Ihre Bemerkung:

Maybe, but the result is that many devs use @+id everywhere, since there is no error if the id is already defined, and everything works just fine. That means the compiler tests if the id already exist, but not if it does not exist, that's crazy 

Dann die Entwickler imo das @ + id Konstruktion missbräuchlich.

Es ist noch viel besser, zwischen @ + id und @id unterscheiden zu können, da der Compiler (bei denen, die die @ + ID nicht missbrauchen) eine Chance hat, bei falschen Referenzen einen Fehler bei der Kompilierung zu geben .

EDIT2

Und den Kommentar zu adressieren:

That's the link I gave in the first sentence. It explains the difference but does not answer why the '+' cannot be automatically infered by AAPT 

Ich glaube, es kann, es funktioniert einfach nicht aufgrund der Argumentation oben (ich glaube).

+0

Dies zu tun, um den Entwicklern zu helfen, ist in der Tat eine Möglichkeit. Versuchen Sie jedoch, einige UI-Elemente in den Eclipse-Designer zu ziehen, und Sie werden sehen, dass @ + ID EVERYWHERE verwendet wird! Da es ein offizielles Android-Tool ist, finde ich dieses Verhalten seltsam, da die meisten neuen Benutzer diesen Designer verwenden und sich den Code ansehen. –

+0

Ich kann Ihren Punkt sehen, aber da es ein Werkzeug ist, wird es sicher gültige Referenzen generieren und kann einen Grund haben, die @ + ID zu verwenden (einfacher für sie, denke ich). Unter dem Strich benötigen sie keine Hilfe zur Kompilierzeit, die @id bringt. – cYrixmorten

Verwandte Themen