Agregar mediante progtwigción una vista debajo de otra en disposición relativa

Quiero algo como esto programáticamente:

view1 | view2 view3 | view4 ---------------- view1 | view2 view3 | view4 ---------------- view1 | view2 view3 | view4 --------------- ........... ...... which keeps repeating -------------- 

No quiero usar ListView.

Importante: recuerde establecer la ID para cada vista.

 RelativeLayout layout = new RelativeLayout(this); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setLayoutParams(layoutParams); RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams params3 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams params4 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); TextView tv1 = new TextView(this); tv1.setId(1); tv1.setText("textView1"); TextView tv2 = new TextView(this); params2.addRule(RelativeLayout.RIGHT_OF, tv1.getId()); tv2.setId(2); tv2.setText("textView2"); TextView tv3 = new TextView(this); params3.addRule(RelativeLayout.BELOW, tv1.getId()); tv3.setId(3); tv3.setText("textView3"); TextView tv4 = new TextView(this); params4.addRule(RelativeLayout.RIGHT_OF, tv3.getId()); params4.addRule(RelativeLayout.ALIGN_BOTTOM, tv3.getId()); tv4.setId(4); tv4.setText("textView4"); layout.addView(tv1, params1); layout.addView(tv2, params2); layout.addView(tv3, params3); layout.addView(tv4, params4); 

En lugar de usar params de diseño múltiples como se sugiere en la respuesta de @Askilondz, puede usar addRule y removeRule como se muestra a continuación:

 RelativeLayout rl = new RelativeLayout(this.getContext()); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); TextView tv1 = new TextView(this); tv1.setId(View.generateViewId()); tv1.setText("textView1"); TextView tv2 = new TextView(this); tv2.setId(View.generateViewId()); tv2.setText("textView2"); lp.addRule(RelativeLayout.BELOW, tv1.getId()); rl.addView(tv2, lp); lp.removeRule(RelativeLayout.BELOW); . . . 

Si está utilizando SDK <17, debe crear el archivo id’s.xml , como values -> ids.xml con una estructura como:

 < ?xml version="1.0" encoding="utf-8"?>     

y configúrelos en su código como:

 tv1.setId(R.id.tv1); tv2.setId(R.id.tv2); 

ACTUALIZAR Parece que Agregar varias reglas para el mismo LayoutParams no funciona bien, de todos modos, voy a mantener mi respuesta en caso de que alguien le multa algo útil para él

 ImageView imageView = new ImageView(this); // set the Drawable on the ImageView imageView.setImageDrawable(bmd); // center the Image imageView.setScaleType(ScaleType.CENTER); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);