En primer lugar: sí, leí todos los otros hilos sobre este tema. Y no solo los de este sitio ... (ya ves, estoy un poco frustrado)
La mayoría de ellos vienen con el consejo de usar en android:id
lugar de solo id
en el archivo XML. Yo hice.
De otros, aprendí, eso View.findViewById
funciona de otra manera Activity.findViewById
. Yo también manejé eso.
En mi location_layout.xml
, yo uso:
<FrameLayout .... >
<some.package.MyCustomView ... />
<LinearLayout ... >
<TextView ...
android:id="@+id/txtLat" />
...
</LinearLayout>
</FrameLayout>
En mi actividad hago:
...
setContentView( R.layout.location_layout );
y en mi clase de vista personalizada:
...
TextView tv = (TextView) findViewById( R.id.txtLat );
que devuelve null
. Al hacer esto, mi actividad funciona bien. Entonces quizás sea por las diferencias Activity.findViewById
y View.findViewById
. Así que almacené el contexto pasado al constructor de la vista de aduanas localmente e intenté:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
que también regresó null
.
Luego, cambié mi vista personalizada para ampliar en su ViewGroup
lugar View
y cambié location_layout.xml
para permitir que TextView
sea un hijo directo de mi vista personalizada, para que View.findViewById
funcione como se supone. Sorpresa: no resolvió nada.
Entonces, ¿qué diablos estoy haciendo mal?
Agradeceré cualquier comentario.
fuente
Respuestas:
Posiblemente porque lo estás llamando demasiado temprano. Esperar hasta
onFinishInflate()
. Aquí hay un proyecto de muestra que muestra unView
acceso personalizado a sus contenidos.fuente
onFinishInflate()
.Posiblemente, ¿estás llamando
findViewById
antes de llamarsetContentView
? Si ese es el caso, intente llamarfindViewById
DESPUÉS de llamarsetContentView
fuente
Asegúrese de no tener múltiples versiones de su diseño para diferentes densidades de pantalla. Me encontré con este problema una vez al agregar una nueva identificación a un diseño existente, pero olvidé actualizar la versión hdpi. Si olvida actualizar todas las versiones del archivo de diseño, funcionará para algunas densidades de pantalla pero no para otras.
fuente
FindViewById puede ser nulo si llama al superconstructor incorrecto en una vista personalizada. La etiqueta de identificación es parte de los atributos, por lo que si ignora los atributos, elimine la identificación.
Esto estaría mal
Esto es correcto
fuente
En mi caso, tuve 2 actividades en mi proyecto,
main.xml
ymain2.xml
. Desde el principio,main2
era una copia demain
, y todo funcionaba bien, hasta que he añadido nuevoTextView
amain2
, por lo que elR.id.textview1
llegó a estar disponible para el resto de la aplicación. Luego traté de buscarlo mediante una llamada estándar:y siempre fue nulo. Resultó que en el
onCreate
constructor no estaba creando instanciasmain2
, sino el otro. Yo tenía:en vez de
Me di cuenta de esto después de llegar aquí, en el sitio.
fuente
Junto a las causas clásicas, mencionadas en otra parte:
setContentView()
antesfindViewById()
id
que desea está en la vista o diseño que le ha dado asetContentView()
id
no se duplica accidentalmente en diferentes diseñosHay una que he encontrado para vistas personalizadas en diseños estándar, que va en contra de la documentación:
En teoría, puede crear una vista personalizada y agregarla a un diseño ( ver aquí ). Sin embargo, descubrí que en tales situaciones, a veces el
id
atributo funciona para todas las vistas en el diseño, excepto las personalizadas. La solución que uso es:FrameLayout
con las mismas propiedades de diseño que le gustaría que tuviera la vista personalizada. Dale un apropiadoid
, por ejemploframe_for_custom_view
.En
onCreate
:que pone la vista personalizada en el marco.
fuente
fuente
Una respuesta para aquellos que usan ExpandableListView y se encuentran con esta pregunta según su título.
Tuve este error al intentar trabajar con TextViews en mi hijo y vistas grupales como parte de una implementación ExpandableListView.
Puede usar algo como lo siguiente en sus implementaciones de los métodos getChildView () y getGroupView ().
Encontré esto aquí .
fuente
Soy bastante nuevo en Android / Eclipse, por error agregué las cosas de la interfaz de usuario en
activity_main.xml
lugar defragment_main.xml
. Me tomó algunas horas resolver eso ...fuente
FWIW, no veo que nadie haya resuelto esto de la misma manera que yo necesitaba. No hubo quejas en el momento de la compilación, pero estaba obteniendo una vista nula en tiempo de ejecución y llamando las cosas en el orden correcto. Es decir, findViewById () después de setContentView (). El problema resultó que mi vista está definida en content_main.xml, pero en mi activity_main.xml, carecía de esta declaración:
Cuando agregué eso a activity_main.xml, no más NullPointer.
fuente
Yo tuve el mísmo problema. Estaba usando una biblioteca de terceros que le permite anular su adaptador para un GridView y especificar su propio diseño para cada celda GridView.
Finalmente me di cuenta de lo que estaba pasando. Eclipse todavía estaba usando el archivo xml de diseño de la biblioteca para cada celda en GridView, aunque no dio ninguna indicación de esto. En mi adaptador personalizado, indicaba que estaba usando el recurso xml de mi propio proyecto, aunque en tiempo de ejecución, no lo era.
Entonces, lo que hice fue asegurarme de que mis diseños e identificadores xml personalizados fueran diferentes de los que todavía estaban en la biblioteca, limpiaron el proyecto y luego comenzaron a leer los diseños personalizados correctos que estaban en mi proyecto.
En resumen, tenga cuidado si anula el adaptador de una biblioteca de terceros y especifica su propio diseño xml para que lo use el adaptador. Si su diseño dentro de su proyecto tiene el mismo nombre de archivo que el de la biblioteca, ¡es posible que encuentre un error realmente difícil de encontrar!
fuente
En mi caso particular, estaba tratando de agregar un pie de página a ListView. La siguiente llamada en onCreate () estaba devolviendo nulo.
Cambiar esto para inflar la vista del pie de página en lugar de encontrarlo por ID resolvió este problema.
fuente
En mi caso, estaba usando ExpandableListView y lo había configurado
android:transcriptMode="normal"
. Esto estaba causando la desaparición de pocos niños en el grupo expandible y solía obtener una excepción NULL cuando usaba la lista.fuente
Para mí, tenía dos diseños xml para la misma actividad: uno en modo vertical y otro en horizontal. Por supuesto, había cambiado la identificación de un objeto en el xml horizontal pero había olvidado hacer el mismo cambio en la versión vertical. Asegúrese de que si cambia uno, haga lo mismo con el otro xml o no recibirá un error hasta que lo ejecute / depure y no pueda encontrar la identificación que no cambió. Oh tontos errores, ¿por qué debes castigarme así?
fuente
Establecer el contenido de la actividad de un recurso de diseño. es decir,.
setContentView(R.layout.basicXml)
;fuente
Además de las soluciones anteriores, se asegura
tools:context=".TakeMultipleImages"
de que el diseño tenga el mismo valor en el archivo mainfest.xml:android:name=".TakeMultipleImages"
para el mismo elemento de actividad. ocurre cuando se usa copiar y pegar para crear una nueva actividadfuente
Tengo el mismo problema, pero creo que vale la pena compartirlo con ustedes. Si tiene que encontrar ViewById en un diseño personalizado, por ejemplo:
No puede obtener la vista en constructor. Debe llamar a findViewById después de que la vista se haya inflado. Es un método que puede anular
onFinishInflate
fuente
Solo quería lanzar mi caso específico aquí. Podría ayudar a alguien en el futuro.
Estaba usando la directiva en mi UI XML de Android así:
Vista principal:
Vista secundaria (retry_button):
.findViewById (R.id.retry) siempre devolvería nulo. Pero, si moví el ID de la vista secundaria a la etiqueta de inclusión, comenzó a funcionar.
Padre fijo:
Niño fijo:
fuente
Mi caso no es como el anterior, no funcionó ninguna solución. Supongo que mi punto de vista era demasiado profundo en la jerarquía de diseño. Lo subí un nivel y ya no era nulo.
fuente
En mi caso, había inflado el diseño, pero las vistas secundarias estaban volviendo nulas. Originalmente tuve esto:
Sin embargo, cuando lo cambié a lo siguiente funcionó:
La clave era hacer referencia específica al diseño ya inflado para obtener las vistas secundarias. Es decir, para agregar
footerView
:fuente
En mi experiencia, parece que esto también puede suceder cuando se llama a su código después de OnDestroyView (cuando el fragmento está en la pila posterior). Si está actualizando la IU en la entrada de un BroadCastReceiver, debe verificar si este es el caso .
fuente
¡INFLAR EL DISEÑO! (que contiene la identificación)
En mi caso, findViewById () devuelve nulo, porque el diseño en el que se escribió el elemento no se infló ...
P.ej. fragment_layout.xml
findViewById (R.id.listview) devuelve nulo, porque no había hecho inflater.inflate (R.layout.fragment_layout, ..., ...); antes de eso.
Espero que esta respuesta ayude a algunos de ustedes.
fuente
Mi solución fue simplemente limpiar el proyecto.
fuente
findViewById también puede devolver nulo si está dentro de un Fragmento. Como se describe aquí: findViewById en Fragment
Debe llamar a getView () para devolver la Vista de nivel superior dentro de un Fragmento. Luego puede encontrar los elementos de diseño (botones, vistas de texto, etc.)
fuente
He intentado todo lo anterior, nada funcionaba ... así que tuve que hacer mi ImageView fuera estático
public static ImageView texture;
y luegotexture = (ImageView) findViewById(R.id.texture_back);
, no creo que sea un buen enfoque, pero esto realmente funcionó para mi caso :)fuente
En mi caso, findViewById devolvió nulo cuando moví la llamada de un objeto primario a un objeto adaptador instanciado por el padre. Después de probar los trucos enumerados aquí sin éxito, moví el findViewById nuevamente al objeto principal y pasé el resultado como un parámetro durante la creación de instancias del objeto adaptador. Por ejemplo, hice esto en el objeto padre:
Luego pasé el hdSpinner como parámetro durante la creación del objeto adaptador:
fuente
Se bloqueó para mí porque uno de los campos en mi id de actividad coincidía con el id en otra actividad. Lo arreglé dando una identificación única.
En mi contraseña de loginActivity.xml, la identificación del campo era "contraseña". En mi actividad de registro, simplemente lo arreglé dando la contraseña r_password, luego devolvió un objeto no nulo:
fuente
Estaba enfrentando un problema similar cuando intentaba hacer una vista personalizada para a
ListView
.Lo resolví simplemente haciendo esto:
fuente
Formas de depurar y encontrar el problema:
En mi caso, estaba usando activity_main.xml tanto en mi módulo de aplicación como en mi módulo de biblioteca. Entonces, cuando realicé los pasos anteriores, en lugar del diseño que diseñé en la biblioteca, el diseño dentro del módulo de la aplicación se infló.
Así que cambié el nombre del archivo activity_main.xml a activity_main_lib.xml.
Así que asegúrese de no tener nombres de diseño duplicados en todo su proyecto .
fuente