221 votos

Exponiendo puntos de vista en RelativeLayout mediante programación

Estoy tratando de lograr la siguiente programación (en lugar de forma declarativa vía XML):

<RelativeLayout...>
   <TextView ...
      android:id="@+id/label1" />
   <TextView ...
      android:id="@+id/label2"
      android:layout_below: "@id/label1" />
</RelativeLayout>

En otras palabras, cómo puedo hacer el segundo TextView aparecen por debajo de la primera, pero quiero hacerlo en código:

RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);

Actualización:

Gracias, TreeUK. Tengo entendido que la dirección general, pero todavía no funciona - "B" superpone "A". ¿Qué estoy haciendo mal?

RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");

TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());

layout.addView(tv1);        
layout.addView(tv2, lp);

191voto

De lo que he sido capaz de armar, tienes que añadir la vista mediante LayoutParams.

LinearLayout linearLayout = new LinearLayout(this);

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

parentView.addView(linearLayout, relativeParams);

Todo el crédito a sechastain, a la posición relativamente sus artículos mediante programación tiene que asignar identificadores a ellos.

TextView tv1 = new TextView(this);
tv1.setId(1);
TextView tv2 = new TextView(this);
tv2.setId(2);

EntoncesaddRule(RelativeLayout.RIGHT_OF, tv1.getId());

58voto

Meymann Puntos 998

Cortar la larga historia corta: Con relativa diseño de la posición de los elementos dentro del diseño.

  1. crear un nuevo RelativeLayout.LayoutParams

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(...)
    

    (de lo que sea... relleno de los padres o una envoltura de contenido, los números absolutos si debe, o referencia a un recurso XML)

  2. Agregar reglas: Las reglas se refieren a los padres o a otros "hermanos" en la jerarquía.

    lp.addRule(RelativeLayout.BELOW, someOtherView.getId())
    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
    
  3. Acaba de solicitar el diseño de parámetros: La mayoría de los 'sanos' manera de hacerlo es:

    parentLayout.addView(myView, lp)
    

Cuidado: no cambio de diseño en el diseño de las devoluciones de llamada. Es tentador hacerlo porque es cuando vistas a obtener su tamaño real. Sin embargo, en ese caso, los inesperados resultados sean los esperados.

29voto

fastfox Puntos 186

Acabo de pasar 4 horas con este problema. Finalmente se dio cuenta usted no debe utilizar cero como id de vista. Uno pensaría que está permitido como NO_ID == -1, pero las cosas tienden a ir loco si lo dar su punto de vista...

5voto

user299870 Puntos 41

llamada

tv1.setId(1) 

después de

tv1.setText("A");

2voto

gnB Puntos 760

Este enfoque con ViewGroup.MarginLayoutParams trabajó para mí:

RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.my_layout);

TextView someTextView = ...

int leftMargin = Util.getXPos();
int topMargin = Util.getYPos();

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
    new ViewGroup.MarginLayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT));

lp.setMargins(leftMargin, topMargin, 0, 0);

myLayout.addView(someTextView, lp);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X