Foros del Web » Programando para Internet » Android »

[SOLUCIONADO] findViewById me retorna NULL, porque?!?!

Estas en el tema de findViewById me retorna NULL, porque?!?! en el foro de Android en Foros del Web. Hola buen dia, verán, soy un poco nuevo en la programación en android y mientras practicaba un poco las animaciones me topé con este problema: ...
  #1 (permalink)  
Antiguo 03/08/2013, 09:32
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 9 meses
Puntos: 1
Pregunta findViewById me retorna NULL, porque?!?!

Hola buen dia, verán, soy un poco nuevo en la programación en android y mientras practicaba un poco las animaciones me topé con este problema: MI IMAGEN ERA NULA (A la hora de ejecutar me lanzaba un NullPointerException) y viendo que era encontré que mi imagen no estaba inicializada, FindViewByID no me regresaba nada!!! y no encuntro el porque!!!

Mi Actividad Principal:
Código Java:
Ver original
  1. public class MainActivity extends Activity {
  2.     private ImageView imagen;
  3.     private AnimationDrawable animacion;
  4.  
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         animacion = (AnimationDrawable) getResources().getDrawable(R.drawable.animacion1);
  9.         imagen = (ImageView) findViewById(R.id.imageView1);
  10.         if (imagen == null) Log.d("PRUEBA","ES NULA LA IMAGEN");
  11.         imagen.setBackgroundColor(Color.WHITE);
  12.         imagen.setImageDrawable(animacion);
  13.         imagen.setOnClickListener(
  14.                 new OnClickListener() {
  15.                     public void onClick(View v) {
  16.                         animacion.start();
  17.                     }
  18.                 }
  19.         );
  20.         setContentView(R.layout.activity_main);
  21.     }
  22. }



y el Layout de mi actividad principal es este:

Código XML:
Ver original
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.    xmlns:tools="http://schemas.android.com/tools"
  3.    android:layout_width="match_parent"
  4.    android:layout_height="match_parent"
  5.    android:paddingBottom="@dimen/activity_vertical_margin"
  6.    android:paddingLeft="@dimen/activity_horizontal_margin"
  7.    android:paddingRight="@dimen/activity_horizontal_margin"
  8.    android:paddingTop="@dimen/activity_vertical_margin"
  9.    tools:context=".MainActivity" >
  10.  
  11.     <ImageView
  12.        android:id="@+id/imageView1"
  13.        android:layout_width="130dp"
  14.        android:layout_height="160dp"
  15.        android:layout_centerHorizontal="true"
  16.        android:layout_centerVertical="true" />
  17.  
  18. </RelativeLayout>


Si necesitan que suba el código de la animación, lo subo, aunque no lo consideré necesario pues la animación no me da problemas, el problema es la imagen

NOTA: Antes intenté usar, imagen = new ImageView(this); y en setContentView(imagen) le mandaba la imagen, pero esto hacía que la animacion usara la pantalla completa, y yo quiero que sea una parte en especifico, por eso estoy usando la imagen vacía en el Layout y en el onCreate le asigno su contenido

AYUUDAAAAA!!!

Gracias
  #2 (permalink)  
Antiguo 03/08/2013, 09:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: findViewById me retorna NULL, porque?!?!

Primero tienes que setear el layout.

Código Java:
Ver original
  1. public class MainActivity extends Activity {
  2.     private ImageView imagen;
  3.     private AnimationDrawable animacion;
  4.  
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.  
  10.         animacion = (AnimationDrawable) getResources().getDrawable(R.drawable.animacion1);
  11.         imagen = (ImageView) findViewById(R.id.imageView1);
  12.         if (imagen == null) Log.d("PRUEBA","ES NULA LA IMAGEN");
  13.         imagen.setBackgroundColor(Color.WHITE);
  14.         imagen.setImageDrawable(animacion);
  15.         imagen.setOnClickListener(
  16.                 new OnClickListener() {
  17.                     public void onClick(View v) {
  18.                         animacion.start();
  19.                     }
  20.                 }
  21.         );
  22.     }
  23. }
  #3 (permalink)  
Antiguo 03/08/2013, 10:07
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: findViewById me retorna NULL, porque?!?!

Amigo eres grande!!!

Nunca pensé que esa podía ser la causa, pero asi fue y no puedo creer que haya sido algo tan sensillo!!!


Aun que me gustaría saber el porque de que se tenga que setear primero el Layout, según me hace pensar mi lógica es porque al setear, se crea el objeto del XML, y asi ya podemos acceder a los elementos, PIENSO, pero me gustaría me explicaras el porque es tan importante ese orden dentro del código para que funcione
  #4 (permalink)  
Antiguo 03/08/2013, 10:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: findViewById me retorna NULL, porque?!?!

No se si haz notado que R.id contiene todos los id de todos los layouts, entonces tienes que primero indicarle el layout y después el id en ese layout. Básicamente es para darle contexto, porque podrías tener el id imageView1 en diferentes layouts y no sabría a cual de todos te refieres.
  #5 (permalink)  
Antiguo 03/08/2013, 10:31
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: findViewById me retorna NULL, porque?!?!

Cierto, no lo había visto asi, pero entonces me puedes decir que en mi programa puedo tener 3 ImageView con el mismo ID (ImageView1) y estos en diferentes actividades y esto no me causará ningún problema??

Es buena esta práctica? o lo mejor es darle un ID claro a cada View?

Saludos desde Puebla
  #6 (permalink)  
Antiguo 03/08/2013, 10:37
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: findViewById me retorna NULL, porque?!?!

Cita:
Iniciado por jordy48 Ver Mensaje
Cierto, no lo había visto asi, pero entonces me puedes decir que en mi programa puedo tener 3 ImageView con el mismo ID (ImageView1) y estos en diferentes actividades y esto no me causará ningún problema??
Exacto, no causara ningun problema.

Cita:
Iniciado por jordy48 Ver Mensaje
Es buena esta práctica? o lo mejor es darle un ID claro a cada View?
No, no es una buena practica de hecho enumerar tus variables, como var1, var2 ya es considerado una mala practica. De preferencia es mejor darle un nombre adecuado a cada view, recuerda tiene que ser único dentro del layout.
  #7 (permalink)  
Antiguo 03/08/2013, 11:16
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: findViewById me retorna NULL, porque?!?!

Muchas gracias nuevamente.

Oye, continue practicando y ahora me sale este error, no se ni que debo hacer, no se si tambien podrías ayudar. Hice mi propio View y lo jale desde la paleta para editar sus propiedades en XML




Layout Principal:
Código XML:
Ver original
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.    xmlns:tools="http://schemas.android.com/tools"
  3.    android:id="@+id/LinearLayout1"
  4.    android:layout_width="match_parent"
  5.    android:layout_height="match_parent"
  6.    android:orientation="vertical"
  7.    android:paddingBottom="@dimen/activity_vertical_margin"
  8.    android:paddingLeft="@dimen/activity_horizontal_margin"
  9.    android:paddingRight="@dimen/activity_horizontal_margin"
  10.    android:paddingTop="@dimen/activity_vertical_margin"
  11.    tools:context=".EjemploGraficosActivity" >
  12.  
  13.     <com.example.ejemplograficos.EjemploView2
  14.        android:id="@+id/ejemploView1"
  15.        android:layout_width="200dp"
  16.        android:layout_height="100dp" />
  17.  
  18.     <com.example.ejemplograficos.EjemploView2
  19.        android:id="@+id/ejemploView2"
  20.        android:layout_width="fill_parent"
  21.        android:layout_height="fill_parent" />
  22.  
  23. </LinearLayout>


Codigo Java de la actividad principal:
Código Java:
Ver original
  1. public class EjemploGraficosActivity extends Activity {
  2.  
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.main_ejemplo_graficos);
  7.     }
  8. }


El nuevo View que defini:
Código Java:
Ver original
  1. public class EjemploView2 extends View{
  2.     private ShapeDrawable miImagen;
  3.    
  4.     EjemploView2(Context context, AttributeSet attrs) {
  5.         super(context, attrs);
  6.         miImagen = new ShapeDrawable(new OvalShape());
  7.         miImagen.getPaint().setColor(0xff0000ff);
  8.     }
  9.    
  10.     @Override
  11.     protected void onSizeChanged(int ancho, int alto, int ancho_ant, int alto_ant) {
  12.         super.onSizeChanged(ancho, alto, ancho_ant, alto_ant);
  13.         miImagen.setBounds(0,0,ancho,alto);    
  14.     }
  15.    
  16.     @Override
  17.     protected void onDraw(Canvas canvas) {
  18.         super.onDraw(canvas);
  19.         miImagen.draw(canvas);
  20.     }
  21. }



GRACIAAAAS!!

Etiquetas: animacion, null
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:47.