Cómo agregar vistas a vistas mediante programación

Resuelto Moki asked hace 54 años • 0 respuestas

Digamos que tengo un LinearLayouty 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.

Moki avatar Jan 01 '70 08:01 Moki
Aceptado

Llamar addViewes 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 setLayoutParamsa 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.

Brian Cooley avatar Mar 07 '2010 20:03 Brian Cooley

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)
}
ndori avatar Jun 25 '2014 14:06 ndori

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.

AndroidOptimist avatar Feb 19 '2014 10:02 AndroidOptimist