2011-01-31 13 views
16

He estado buscando en todas partes una respuesta a esta pregunta. Soy nuevo en Android e intento agregar elementos a un diseño relativo programáticamente a través de java en lugar de xml. Creé una clase de prueba para probarla, pero los elementos siguen apilando en lugar de formatearlos correctamente. Simplemente quiero una TextView debajo de la otra por ahora (con el tiempo voy a utilizar la izquierda y derecha de los parámetros pero estoy empezando sencilla. ¿Qué me falta?Agregando elementos de forma programada a un diseño relativo

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ScrollView sv = new ScrollView(this); 
    RelativeLayout ll = new RelativeLayout(this); 
    ll.setId(99); 
    sv.addView(ll); 
    TextView tv = new TextView(this); 
    tv.setText("txt1"); 
    tv.setId(1); 
    TextView tv2 = new TextView(this); 
    tv2.setText("txt2"); 
    tv2.setId(2); 
    RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    lay.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    ll.addView(tv, lay); 
    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    p.addRule(RelativeLayout.ALIGN_BOTTOM, tv.getId()); 
    ll.addView(tv2, p); this.setContentView(sv);}; 

Respuesta

20
p.addRule(RelativeLayout.ALIGN_BOTTOM, tv.getId()); 

significa Esta línea que la de la parte inferior de tv2 se alinea con la parte inferior de tv, en otras palabras, se cubrirán mutuamente. La propiedad que desea es presumiblemente RelativeLayout.BELOW. Sin embargo, recomiendo utilizar xml para esto en su lugar.

+1

Gracias, en realidad era RelativeLayout.Below, pero lo suficientemente cerca. El problema con hacer xml es que eventualmente esto se completará desde una base de datos externa. – user597436

2

le faltan varias cosas, primero el ScrollView no tiene medidas, configúrelo con LayoutParams.FILL_PARENT o WRAP_CONTENT, segundo; TextView1 está fuera de lugar para TextView2, s et Posición TextView1 con lay.addRule (RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ScrollView sv = new ScrollView(this); 
    RelativeLayout ll = new RelativeLayout(this); 
    ll.setId(99); 

    sv.addView(ll, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    TextView tv = new TextView(this); 
    tv.setText("txt1"); 
    tv.setId(1); 

    TextView tv2 = new TextView(this); 
    tv2.setText("txt2"); 
    tv2.setId(2); 
    RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    lay.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
    ll.addView(tv, lay); 
    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    p.addRule(RelativeLayout.ALIGN_BOTTOM, tv.getId()); 
    ll.addView(tv2, p); 
this.setContentView(sv);}; 
+0

aquí hay un error, la línea p.addRule (RelativeLayout.ALIGN_BOTTOM, tv.getId()); debe ser como @Cristian dice: p.addRule (RelativeLayout.BELOW, tv.getId()); – Franco

5

Uso:

p.addRule(RelativeLayout.BELOW, tv.getId()); 
Cuestiones relacionadas