2014-09-17 13 views
5

[AGGIORNAMENTO] - Volevo solo confermare a tutti che sono d'accordo che è SEMPRE una cattiva idea usare un numero fisso. La mia curiosità era quando si utilizzava l'API di Maps a quale valore di enumerazione 1, 2 è stato assegnato. Mi sarei sentito più a mio agio se avessi trovato qualcosa come R.id.my_current_location_view.Qualcuno può spiegarmi la magia dietro FindViewById (1) o FindViewById (2)?

Vedo quel codice cosparso in questa domanda e altre domande. Come sanno le persone utilizzare findViewById (1), ecc.? vs. findViewById (R.id.something);

Change position of Google Maps API's "My location" button

Sembra che ci sia una certa profonda confusione in questa domanda. Mi chiedo quale sia il numero magico di findViewById (1). Se si fa clic sul collegamento, si vedrà che nessuno ha fornito il valore setId (1) a mapView ma in qualche modo le persone sanno di controllare la vista padre e poi findViewById (1) e findViewById (2) ..

Ho posto la domanda anche lì per non perdere il contesto ma sembra che nessuno possa spiegarlo.

+0

quindi apparentemente è un numero magico. L'ID è dal gerarchia. e se google decide di cambiare il proprio id nei servizi di google play, le persone che hanno questo codice li devono cambiare, ma ho visto così tanti posti ... – reidisaki

risposta

1

È una cattiva idea generale utilizzare questo approccio con ID codificati, soprattutto se non si è quello che li imposta in quanto soggetti a modifiche.

Tuttavia, per rispondere alla domanda per capire l'ID da utilizzare, un'opzione è di fare un sacco di ipotesi e controllare il lavoro utilizzando il debugger di Android Studio per attraversare manualmente la gerarchia della vista. Probabilmente ci vorrà molto tempo, quindi un approccio molto più semplice è utilizzare semplicemente lo Hierarchy Viewer, disponibile sia in Android Studio che in Eclipse.

Ecco come appare la parte del layout a cui siamo interessati. Ho ritagliato il layout completo per mostrare la parte pertinente.

enter image description here

siamo ora in grado di abbattere il seguente codice:

View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2); 
  1. findViewById(1) restituirà il LinearLayout (Red Outline) sin dal suo ID è 1.
  2. getParent() torneranno il RelativeLayout che è il genitore di LinearLayout (contorno blu).
  3. findViewById(2) troverà il bambino View dello RelativeLayout con l'ID specificato. In base all'immagine vediamo che lo ImageView (linea verde) che vogliamo ha quell'id.

Sulla base di questo è interessante notare che avremmo potuto appena usato mapView.findViewById(2) per ottenere l'accesso al ImageView direttamente ed evitare le altre chiamate.

Non è sicuro che fosse il caso nelle versioni precedenti ma funziona quando si utilizza l'attuale MapFragment. Se non funziona su versioni precedenti, ciò aiuta a dimostrare che questa è una cattiva pratica in quanto può cambiare tra le versioni.

0

sono entrambi uguali, nel primo caso si fornisce l'identificatore di risorsa che Android crea in R file da solo, e nel secondo caso si fornisce l'identificatore di risorsa che Android ha compilato per voi.

alcuna differenza,

+0

Nel caso del link ho fornito findViewById (1) è l'id MyLocationButton. Come hanno fatto gli sviluppatori a usare quello contro R.id.MyLocationButtonIdIfItExists .. – reidisaki

+0

se hai creato una vista in runtime e non via XML, allora probabilmente avresti fornito l'ID per lo stesso, come setID (1), quindi puoi usa findViewById (1) per recuperare lo stesso. Nel link che hai postato, suppongo che lib woulb abbia creato widget in fase di esecuzione con ID personalizzato. – Techfist

5

View ID sono solo positivi, interi non nulli.

Se avete impostato la vista id in XML utilizzando la sintassi @+id/name, il numero intero è generato in R.java ed è necessario fare riferimento ad esso come R.id.name nel codice.

Se avete impostato la vista id nel codice utilizzando setId(value), è possibile recuperare una visione con quella id da una gerarchia con findViewById(value) dove il valore id può essere un hardcoded positiva, diverso da zero interi come 1 o 2

Generalmente durante la scrittura del codice, cercare di evitare l'uso di costanti numeriche magiche del genere.

+1

giusto così il numero magico .. è solo un numero magico .. lo vedo a volte in codice quindi è solo una cattiva pratica che sta facendo Peopel. e devono sapere che cos'è l'id 1. – reidisaki

0

Si dovrà impostare la vista id prima utilizzando setId(value) e quindi è possibile recuperare una vista utilizzando che id utilizzando findViewById(value)

trovato questo post dare un'occhiata a esso: Link

Documentation per setid() dice :

Imposta l'identificatore per questa vista. L'identificatore non deve essere univoco nella gerarchia di questa vista. L'identificatore dovrebbe essere un numero positivo.

Problemi correlati