setvisibility - view android studio
findViewByID devuelve nulo (26)
En primer lugar: sí, leí todos los otros hilos sobre este tema. Y no solo los de este sitio ... (ves, estoy un poco frustrado)
La mayoría viene con el consejo de usar android:id
lugar de solo id
en el archivo XML. Yo si.
De otros, aprendí, que View.findViewById
funciona diferente a Activity.findViewById
. Yo también me encargué de eso.
En mi location_layout.xml
, 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
. Haciendo esto, mi actividad funciona bien. Tal vez sea debido a las diferencias Activity.findViewById
y View.findViewById
. Así que almacené el contexto pasado al constructor de la vista de aduanas localmente y probé:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
que también devolvió null
.
Luego, cambié mi vista personalizada para extender ViewGroup
lugar de View
y cambié location_layout.xml
para permitir que TextView
sea un elemento secundario directo de mi vista personalizada, de modo que View.findViewById
debería funcionar como se supone. Sorpresa: no resolvió nada.
Entonces, ¿qué diablos estoy haciendo mal?
Apreciaré cualquier comentario.
que devuelve nulo
Posiblemente porque lo llamas demasiado pronto. Espera hasta que onFinishInflate()
. Aquí hay un proyecto de muestra que muestra una View
personalizada que accede a su contenido.
Además de las soluciones anteriores, asegúrese de que el
tools:context=".TakeMultipleImages"
en el diseño tiene el mismo valor en el archivo mainfest.xml:
android:name=".TakeMultipleImages"
para el mismo elemento de actividad. Se produce cuando se usa copiar y pegar para crear una nueva actividad.
Asegúrese de no tener varias versiones de su diseño para diferentes densidades de pantalla. Me encontré con este problema una vez cuando agregué 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.
En mi caso particular, estaba tratando de agregar un pie de página a un ListView. La siguiente llamada en onCreate () estaba devolviendo null.
TextView footerView = (TextView) placesListView.findViewById(R.id.footer);
Cambiar esto para inflar la vista del pie de página en lugar de encontrarlo por ID resolvió este problema.
View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);
En mi caso, estaba usando ExpandableListView y había configurado android:transcriptMode="normal"
. Esto provocaba que desaparecieran pocos niños en el grupo expandible y solía obtener la excepción NULA cuando utilizaba para desplazarme por la lista.
En mi caso, findViewById devolvió un valor nulo cuando moví la llamada de un objeto principal a un objeto adaptador creado por el principal. Después de probar los trucos enumerados aquí sin éxito, moví el findViewById de nuevo 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:
Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);
Luego pasé el hdSpinner como un parámetro durante la creación del objeto adaptador:
mTransactionAdapter = new TransactionAdapter(getActivity(),
R.layout.transactions_list_item, null, from, to, 0, hdSpinner);
En mi caso, había inflado el diseño, pero las vistas de los niños volvían a ser nulas. Originalmente tuve esto:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
pbSpinner = (ProgressBar) findViewById(R.id.pbListviewFooter);
tvText = (TextView) findViewById(R.id.tvListviewFooter);
...
}
Sin embargo, cuando lo cambié a lo siguiente funcionó:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
pbSpinner = (ProgressBar) footerView.findViewById(R.id.pbListviewFooter);
tvText = (TextView) footerView.findViewById(R.id.tvListviewFooter);
...
}
La clave fue hacer referencia específica al diseño ya inflado para obtener las vistas del niño. Es decir, para agregar footerView
:
- footerView .findViewById ...
En mi caso, tuve 2 actividades en mi proyecto, main.xml
y main2.xml
. Desde el principio, main2
era una copia de main
, y todo funcionaba bien, hasta que agregué TextView
nuevo a main2
, por lo que R.id.textview1
estuvo disponible para el resto de la aplicación. Luego traté de buscarlo mediante una llamada estándar:
TextView tv = (TextView) findViewById( R.id.textview1 );
Y siempre fue nulo. Resultó que en el constructor onCreate
estaba creando una instancia no de main2
, sino del otro. Tuve:
setContentView(R.layout.main);
en lugar de
setContentView(R.layout.main2);
Noté esto después de que llegué aquí, en el sitio.
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 trasera). Si está actualizando la interfaz de usuario en una entrada de BroadCastReceiver, debería verificar si este es el caso .
Establecer el contenido de la actividad de un recurso de diseño. es decir, setContentView(R.layout.basicXml)
;
FWIW, no veo que nadie haya resuelto esto de la misma manera que yo necesitaba. No tengo quejas en el momento de la compilación, pero obtuve una vista nula en el tiempo de ejecución y llamé 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, me faltaba esta declaración:
<include layout="@layout/content_main" />
Cuando agregué eso a activity_main.xml, no más NullPointer.
FindViewById puede ser nulo si llama al super constructor incorrecto en una vista personalizada. La etiqueta de identificación es parte de attrs, por lo que si ignora attrs, borra la identificación.
Esto estaría mal
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context);
}
Esto es correcto
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context,attrs);
}
He intentado todo lo anterior. Nada estaba funcionando ... así que tuve que hacer mi ImageView estática public static ImageView texture;
y luego texture = (ImageView) findViewById(R.id.texture_back);
No creo que sea un buen enfoque, pero esto realmente funcionó para mi caso :)
INFLAR EL DISEÑO !! (que contiene el id)
En mi caso, findViewById () devolvió un valor nulo, porque el diseño en el que se escribió el elemento no se infla ...
P.ej. fragment_layout.xml
<ListView
android:id="@+id/listview">
findViewById (R.id.listview) devolvió nulo, porque no había hecho inflater.inflate (R.layout.fragment_layout, ..., ...); antes de eso.
Espero que esta respuesta ayude a algunos de ustedes.
Junto a las causas clásicas, mencionadas en otra parte:
- Asegúrate de que has llamado
setContentView()
antes defindViewById()
- Asegúrese de que el
id
que desea está en la vista o el diseño que ha asignado asetContentView()
- Asegúrese de que la
id
no se duplique accidentalmente en diferentes diseños
Hay uno 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 ( consulte aquí ). Sin embargo, he encontrado que en tales situaciones, a veces el atributo id
funciona para todas las vistas en el diseño, excepto las personalizadas. La solución que utilizo es:
- Reemplace cada vista personalizada con un
FrameLayout
con las mismas propiedades de diseño que le gustaría que tuviera la vista personalizada. Déle unaid
apropiada, digaframe_for_custom_view
. En
onCreate
:setContentView(R.layout.my_layout); FrameView fv = findViewById(R.id.frame_for_custom_layout); MyCustomView cv = new MyCustomView(context); fv.addView(cv);
lo que pone la vista personalizada en el marco.
Mi caso no es como el de arriba, ninguna solución funcionó. Supongo que mi visión era demasiado profunda en la jerarquía de diseño. Lo subí un nivel y ya no era nulo.
Mi solución fue simplemente limpiar el proyecto.
Para mí tenía dos diseños xml para la misma actividad: uno en modo retrato y otro en paisaje. Por supuesto que había cambiado la identificación de un objeto en el xml de paisaje, pero había olvidado hacer el mismo cambio en la versión de retrato. Asegúrese de que si cambia uno, haga lo mismo con el otro xml o no obtendrá un error hasta que lo ejecute / depure y no pueda encontrar la ID que no cambió. Oh tontos errores, ¿por qué me castigas así?
Posiblemente, ¿está llamando a findViewById
antes de llamar a setContentView
? Si ese es el caso, intente llamar a findViewById
DESPUÉS de llamar a setContentView
Sólo quería tirar mi caso específico aquí. Podría ayudar a alguien en la línea.
Estaba usando la directiva en mi UI XML de Android de esta manera:
Vista de los padres:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="home_phone"
android:background="@color/colorPrimary">
...
<include
layout="@layout/retry_button"
android:visibility="gone" />
Vista del niño (botón retry):
<com.foo.RetryButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/retry"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="140dp">
.findViewById (R.id.retry) siempre devolverá null. Pero, si moví el ID de la vista secundaria a la etiqueta de inclusión, comenzó a funcionar.
Padre fijo:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="home_phone"
android:background="@color/colorPrimary">
...
<include
layout="@layout/retry_button"
android:id="@+id/retry"
android:visibility="gone" />
Hijo fijo
<com.foo.RetryButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="140dp">
Soy bastante nuevo en Android / Eclipse, por error agregué el contenido de la interfaz de usuario a activity_main.xml
lugar de fragment_main.xml
. Me tomó algunas horas darme cuenta de eso ...
Tengo el mismo problema, pero creo que vale la pena compartirlo con ustedes. Si tiene que encontrarViewById en un diseño personalizado, por ejemplo:
public class MiniPlayerControllBar extends LinearLayout {
//code
}
no se puede obtener la vista en el constructor. Deberías llamar a findViewById después de que la vista se haya inflado. Su es un método que puedes anular onFinishInflate
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 de GridView.
Finalmente me di cuenta de lo que estaba pasando. Eclipse todavía estaba utilizando 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, indicó que estaba utilizando el recurso xml de mi propio proyecto, aunque en tiempo de ejecución no lo estaba.
Entonces, lo que hice fue asegurarme de que mis diseños xml e identificadores 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 está anulando el adaptador de una biblioteca de terceros y especificando su propio diseño XML para que el adaptador lo use. Si su diseño dentro de su proyecto tiene el mismo nombre de archivo que en la biblioteca, ¡podría encontrar un error realmente difícil de encontrar!
findViewById también puede devolver null si estás dentro de un Fragmento. Como se describe aquí: findViewById en Fragmento
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.)
Una respuesta para aquellos que usan ExpandableListView y se encuentran con esta pregunta basada en su título.
Tuve este error al intentar trabajar con TextViews en las vistas de mi hijo y grupo como parte de una implementación ExpandableListView.
Puede usar algo como lo siguiente en sus implementaciones de los métodos getChildView () y getGroupView ().
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.child_layout, null);
}
Encontré esto here .
@Override
protected void onStart() {
// use findViewById() here instead of in onCreate()
}