2013-10-23 12 views
8

Conosco la differenza tra @+id e @id (vedere questo accepted answer). Tuttavia, ho sempre la sensazione che sto facendo il lavoro del compilatore AAPT quando scrivo il '+' in @+id.Perché è necessario usare @ + id invece di @id?

C'è una ragione per cui il compilatore di risorse non può dedurre da solo se un identificatore deve essere creato o semplicemente riutilizzato? Una struttura sottostante di hashtable farebbe il lavoro: ogni risorsa con lo stesso id andrà nello stesso bucket, e se la chiave non esiste, basta crearla.

+0

http://stackoverflow.com/questions/5025910/difference-between-id-and-id-in-android - fare riferimento a questo – N20084753

+0

@ N20084753 L'ha già menzionato nell'OP. – Piovezan

+0

@ N20084753 Questo è il collegamento che ho dato nella prima frase. Spiega la differenza ma non risponde perché il '+' non può essere automaticamente dedotto da AAPT. –

risposta

0

con @ + id si sta aggiungendo id a R.java che consente di fare riferimento alle classi Java mentre con @id non si è. Puoi utilizzare @id solo se è già stato creato un ID specifico e lo stai facendo riferimento in un'altra vista, ad es. android:layout_below="@id/some_id"

+1

Grazie, ma come ho detto, so tutto questo. La domanda è: perché è necessario il segno più. Dovrebbe essere molto facile per il compilatore sapere se l'identificatore esiste già o meno, quindi non capisco perché devo dargli questa informazione. –

1

Probabilmente il compilatore non sarebbe in grado di distinguere tra un 'giusto' e un 'id' errato. Se trova un nuovo id (cioè uno che non è nell'hashtable sottostante), assumerebbe sempre che sia un nuovo ID corretto. Non sarebbe in grado di distinguere tra un nuovo ID reale e un ID errato.

+0

Forse, ma il risultato è che molti sviluppatori usano @ + id ovunque, poiché non c'è errore se l'ID è già definito e tutto funziona perfettamente. Ciò significa che il compilatore verifica se l'ID esiste già, ma non se non esiste, è pazzesco. –

1

Immagino sia per aiutare il programmatore.

Se non fosse necessario il @ + id costruzione allora tutti i riferimenti/costruzioni @id sarebbero validi, quindi sarebbe difficile rintracciare un errore, in quanto il compilatore non fallirebbe su riferimenti errati (come sarebbe semplicemente costruire l'id typo).

Inserire in modo diverso, tutti gli errori di riferimento ID dovrebbero essere rilevati in fase di esecuzione.

Edit:

appena notato la risposta simile da Piovezan, per quanto riguarda il tuo commento:

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 

Poi gli sviluppatori sono utilizzati da l'@ + id costruzione imo.

È ancora molto meglio avere l'opzione di distinguere tra @ + id e @id, dal momento che (per coloro che non usano in modo errato l'@ + id) il compilatore ha la possibilità di dare un errore di compilazione su riferimenti errati .

Edit2

E per affrontare il commento:

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 

credo che possa, semplicemente non lo fa a causa della argomentazione di cui sopra (credo).

+0

Fare ciò apposta per aiutare gli sviluppatori è davvero una possibilità. Tuttavia, prova a trascinare e rilasciare alcuni elementi dell'interfaccia utente nella finestra di progettazione eclissi, e vedrai che usa @ + id EVERYWHERE! Poiché si tratta di uno strumento Android ufficiale, trovo questo comportamento strano, dal momento che la maggior parte dei nuovi utenti utilizzerà quel designer e guarderà il codice per imparare. –

+0

Posso vedere il tuo punto ma siccome è uno strumento, genererà sicuramente dei riferimenti validi e potrebbe avere una ragione per usare l'@ + id (più semplice per loro credo). In conclusione, non hanno bisogno dell'aiuto del tempo di compilazione che @id porta. – cYrixmorten

Problemi correlati