Posso utilizzare lo stesso ID in un layout diverso in Android?


90

Sono nuovo nello sviluppo di Android. Va bene usare lo stesso ID per le immagini e TextViewsin diversi Layoutfile XML?

Quando eclipse li elenca automaticamente per me, elenca tutte le variabili di layout dal progetto, quindi si scontrerà? Finora non ho notato problemi nell'utilizzo dello stesso ID in layout diversi, ma a lungo andare sono preoccupato.



@Pavel avrai ancora bisogno degli ID per regolare i vincoli.
Sadda Hussain

Risposte:


96

Si consiglia di utilizzare ID diversi per layout diversi. A lungo termine, quando si avranno molti layout e quindi molti ID, sarà molto complicato differenziarli.

Io di solito nomino miei ids in questo modo: layoutName_elementId.

Funziona per me trovare facilmente l'id che sto cercando, soprattutto quando si utilizza il completamento automatico (so su quale layout sto lavorando, ma non conosco davvero l'id; in questo caso, con la mia strategia di denominazione, io digita solo il nome del layout e porta tutti gli ID di quel layout).

Ulteriori informazioni su layout e ID possono essere trovate qui .

Buona codifica,


2
Qual è il problema di cercare diciamo ok_buttonin ogni tua attività? Il completamento automatico è ancora più chiaro in questo modo se conosci la chat che stai cercando.
Dan Chaltiel

132

Risposta breve: Sì, puoi.

Risposta lunga: puoi farlo perché ogni volta che usi findViewById () per ottenere un riferimento a una parte del tuo layout, il metodo cerca solo quella vista nel layout attualmente gonfiato. Quindi, anche se hai un'altra vista con lo stesso ID in un altro layout, Android non la cercherà lì.


15
Puoi dare una risposta ancora più lunga? Poiché R.id.layout_id è un numero intero statico ed è predeterminato in fase di compilazione, quindi findViewById () non conoscerà il layout attualmente gonfiato.
Chloe

22
Per il bene di chiunque altro incontri questa domanda, volevo rispondere alla richiesta di Chloe. L'ID sarebbe lo stesso per ogni visualizzazione, ma non apparirà mai due volte nella stessa attività. Come metafora, considera cosa accadrebbe se ti dessi una pila di fogli, tutti con un mucchio di numeri sopra. Su molti di questi fogli di carta è scritto il numero 4. Stai guardando uno dei fogli e ti chiedo di cerchiare il 4. È facile. Ora guardi un altro foglio con un 4 sopra. Puoi trovare e cerchia anche quello. Non importa che il numero sia definito in anticipo.
Ted Cannelongo

6
Non sono d'accordo con il commento di Ted, puoi avere contemporaneamente due componenti con lo stesso ID in esecuzione sulla stessa attività. Ho appena avuto il problema su un'app, stavo usando due ViewPager diversi contemporaneamente nell'attività principale. Quando ho provato a recuperare il ViewPager attualmente visualizzato con l'ID, in realtà ha recuperato l'altro in esecuzione in background. Ho risolto il problema semplicemente rendendo unici i due ID.
Yoann Hercouet

8
@YoannHercouet Credo che ciò sia dovuto al fatto che entrambi erano sullo stesso foglio (Attività)
Naheel

22

Secondo le guide API per sviluppatori:

Un ID non deve essere univoco nell'intero albero, ma dovrebbe essere univoco all'interno della parte dell'albero che stai cercando (che spesso può essere l'intero albero, quindi è meglio essere completamente unico quando possibile).

Quindi la risposta breve è che non è obbligatorio ma è una buona pratica per evitare possibili conflitti.


1
Una volta ho creato gli stessi ID per sbaglio. Annullare la ridenominazione in seguito è stato molto faticoso perché tutte le istanze sono state ripristinate. Ciò significa che una volta che hai un conflitto di identità, sei fregato. Sarà molto difficile separare di nuovo tutto.
t3chb0t

@ t3chb0t Per davvero! Anche se selezioni "solo locale", Android Studio rinomina tutte le istanze. È assolutamente ridicolo.
John Glen,

15

Non consigliato, perché se in futuro sarà necessario eseguire il refactoring di view id, Android Studio lo rifatterà in tutti i XMLfile e le classi e ti troverai nei guai.

Ma ci sono anche alcuni casi in cui è necessario utilizzare lo stesso, idad esempio se si dispone di un abstract e si riutilizzano più layout.

Nel caso in cui tu abbia più viewscon lo stesso id'snel tuo progetto e devi rifattorizzare, fallo manualmente, non usare la funzione build in IDE, modifica la idvista di destinazione all'interno del XMLlayout, quindi correggi l'errore rosso all'interno del layout.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.