Agregar imagen mediante programación a RelativeLayout

Quiero agregar a un diseño lineal, varios diseños relativos a través del código. Cada diseño relativo consta de: una vista de imagen a la izquierda, una vista de texto a su lado a la derecha (exactamente en el medio) y otra imagen a la derecha. Debo agregarlos usando datos leídos de una base de datos. Debe ser con un diseño relativo porque quiero usar un oyente sobre la imagen y un oyente diferente sobre la RL.

Cada diseño relativo se parece a esto que tengo en XML.

<RelativeLayout
    android:id="@+id/relativecanal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

       <ImageView
           android:id="@+id/imageView1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="true"
           android:src="@drawable/antena3" />

       <TextView
           android:id="@+id/textView1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_centerVertical="true"
           android:layout_marginLeft="39dp"
           android:layout_toRightOf="@+id/imageView1"
           android:text="Large Text"
           android:textAppearance="?android:attr/textAppearanceLarge" />

       <ImageView
           android:id="@+id/imageView2"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentRight="true"
           android:layout_centerVertical="true"
           android:src="@drawable/star" />

    </RelativeLayout>

Estoy usando este código: pero obtengo una NullPointerException en el momento de hacer addView() para la imagen, lo intenté simplemente agregando textView y funciona.

    try {
     File sdcard = Environment.getExternalStorageDirectory();
     File file = new File(sdcard,archivoCanales);
  LinearLayout layout = (LinearLayout) findViewById(R.id.channelslistlayout);
     BufferedReader br = new BufferedReader(new FileReader(file));
     String line;



     while ((line = br.readLine()) != null) {



         RelativeLayout channel=new RelativeLayout(this);
         channel.setBackgroundColor(2);

         TextView channelName=new TextView(this);
         channelName.setText(new String(line));

         ImageView image=(ImageView)findViewById(R.drawable.animalplanet);


      LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
              LinearLayout.LayoutParams.MATCH_PARENT,
              LinearLayout.LayoutParams.WRAP_CONTENT
      );    

    RelativeLayout.LayoutParams firstImageParams = new RelativeLayout.LayoutParams(
            android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
            android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
            firstImageParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);


         RelativeLayout.LayoutParams secImageParams = new RelativeLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
                secImageParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


         channel.addView(image,firstImageParams);
         channel.addView(channelName,secImageParams);

         layout.addView(channel,llp);
}

 }
 catch (IOException e) {
    e.printStackTrace();
 }

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

Tu estas usando (ImageView)findViewById(R.drawable.animalplanet) y no es una forma adecuada de hacerlo programáticamente afaik. Si desea inflar un ImageView deberías hacer algo como esto:

RelativeLayout.LayoutParams imParams = 
new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
ImageView imSex = new ImageView(context);
imSex.setImageResource(getmyImage());
imSex.setId(2);
addView(imSex,imParams);    

Sin embargo, si solo mostrará la imagen sin que se pueda hacer clic y cargarla desde una base de datos, le sugiero que use un Ver carpeta

contestado el 03 de mayo de 12 a las 18:05

imagen.setImageResource(R.drawable.animalplanet); era la forma correcta de hacerlo. ¡Gracias! - danywarner

aquí, ¿qué es el método addView()? Recibo el error: "El método addView (ImageView, LinearLayout.LayoutParams) no está definido para el tipo AddPhotoActivity". - Carneros

@venkataramana es relativoLayout.addView(imSex,imParams); si estás haciendo esta actividad interna - Nayanesh Gupté

Recibí esta respuesta de otra pregunta, pero aún así +1 por su increíble respuesta: Hamza

No crea una imagen nueva, es por eso que obtiene una excepción de puntero nulo. Debe crear un diseño nuevo o inflar uno nuevo.

contestado el 03 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.