Estoy tratando de lograr lo siguiente mediante programación (en lugar de declarativamente a través de XML):
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
En otras palabras, ¿cómo hago que el segundo TextView
aparezca debajo del primero, 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);
Actualizar:
Gracias, TreeUK. Entiendo la dirección general, pero todavía no funciona: "B" se superpone a "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);
Respuestas:
Por lo que he podido reconstruir, debe agregar la vista usando LayoutParams.
Todo el crédito para sechastain, para posicionar relativamente sus artículos mediante programación, debe asignarles identificadores.
Luego
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
fuente
below
ya se haya agregado, cómo asegurarse de que todavía se procese ¿correctamente? Según tengo entendidoaddView
, el diseño se vuelve a representar, por lo que si lo hago para un elemento cuyo pariente aún no se ha agregado, se bloqueará ya que el elemento con esa ID aún no existe.En pocas palabras: con un diseño relativo, coloca elementos dentro del diseño.
crear un nuevo RelativeLayout.LayoutParams
(lo que sea ... llene el contenido principal o de ajuste, números absolutos si es necesario, o referencia a un recurso XML)
Agregar reglas: las reglas se refieren al padre u otros "hermanos" en la jerarquía.
Simplemente aplique los parámetros de diseño: la forma más 'saludable' de hacerlo es:
Cuidado : no cambie el diseño de las devoluciones de llamada de diseño. Es tentador hacerlo porque es cuando las vistas obtienen su tamaño real. Sin embargo, en ese caso, se esperan resultados inesperados.
fuente
parentLayout.addView(myView, lp
). Siempre hice eso en dos líneas de código. ¡Gracias!Acabo de pasar 4 horas con este problema. Finalmente me di cuenta de que no debes usar cero como id de vista . Pensarías que está permitido como NO_ID == -1, pero las cosas tienden a enloquecer si lo das a tu vista ...
fuente
Ejemplo ejecutable mínimo de Android 22
Fuente:
Funciona con el proyecto predeterminado generado por
android create project ...
. Repositorio de GitHub con un código de compilación mínimo .fuente
TextView
? Lo intenté yTextView
falta el tercero .llamada
después
fuente
Tratar:
fuente
Este enfoque con ViewGroup.MarginLayoutParams funcionó para mí:
fuente
fuente
Si realmente desea diseñar manualmente, le sugiero que no use un diseño estándar en absoluto. Hágalo todo por su cuenta, aquí un ejemplo de kotlin:
Esto podría darte una idea de cómo podría funcionar
fuente