Cómo agregar vistas a vistas mediante programación
Digamos que tengo un LinearLayout
y quiero agregarle una Vista en mi programa desde el código Java. ¿Qué método se utiliza para esto? No estoy preguntando cómo se hace en XML, lo cual sí sé, sino más bien, ¿cómo puedo hacer algo similar a este código de muestra?
(One View).add(Another View)
Como se puede hacer en Swing.
Llamar addView
es la respuesta correcta, pero necesitas hacer un poco más que eso para que funcione.
Si crea una Vista a través de un constructor (por ejemplo, Button myButton = new Button();
), deberá llamar setLayoutParams
a la vista recién construida, pasando una instancia de la clase interna LayoutParams de la vista principal, antes de agregar su hijo recién construido a la vista principal.
Por ejemplo, es posible que tenga el siguiente código en su onCreate()
función suponiendo que LinearLayout tenga una identificación R.id.main
:
LinearLayout myLayout = findViewById(R.id.main);
Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
myLayout.addView(myButton);
Es importante asegurarse de configurar LayoutParams. Cada vista necesita al menos un parámetro layout_width y layout_height. También es importante conseguir la clase interior adecuada. Luché para agregar Vistas a TableRow para que se mostraran correctamente hasta que descubrí que no estaba pasando una instancia de TableRow.LayoutParams a setLayoutParams de la vista secundaria.
La mejor manera que encontré es usar el método inflar estático de Ver.
View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);
donde yourViewXML es algo así como R.layout.myView
tenga en cuenta que necesita un ViewGroup para agregar una vista (que es cualquier diseño que se le ocurra)
Entonces, como ejemplo, digamos que tiene un fragmento cuya vista ya ha sido inflada y sabe que la vista raíz es un diseño y desea agregarle una vista:
View view = getView(); // returns base view of the fragment
if (view == null)
return;
if (!(view instanceof ViewGroup))
return;
ViewGroup viewGroup = (ViewGroup) view;
View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
EDITAR:
Código Kotlin para el ejemplo anterior (la vista es getView() de un fragmento)
(view as? ViewGroup)?.let {
View.inflate(context, R.layout.add_credit_card, it)
}
Para agregar la vista mediante programación, puede hacer:
LinearLayout rlmain = new LinearLayout(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);
LinearLayout ll1 = new LinearLayout (this);
ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);
setContentView(rlmain, llp);
También puede agregar cualquier número de vistas.