2010-03-07 17 views
126

Digamos que tengo LinearLayout y quiero agregarle una vista en mi programa desde el código de Java. ¿Qué método se usa para esto? No estoy preguntando cómo se hace en XML, lo que sí sé, sino más bien, ¿cómo puedo hacer algo en la línea de esto?Cómo agregar vistas a vistas mediante programación

(Una Vista) .add (Otra Vista)

Al igual que uno puede hacer en Swing.

Respuesta

186

Llamar a addView es la respuesta correcta, pero necesita hacer un poco más de eso para que funcione.

Si crea una vista a través de un constructor (por ejemplo, Button myButton = new Button();), que necesita para llamar setLayoutParams en la vista de nueva construcción, pasando por una instancia de LayoutParams de la vista padre clase interna, antes de agregar a su hijo recién construido a la vista principal

Por ejemplo, usted podría tener el siguiente código en su función onCreate() asumiendo que su LinearLayout tiene R.id.main Identificación:

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); 

Asegurarse de establecer las LayoutParams es importante. Cada vista necesita al menos un layout_width y un parámetro de layout_height. También es importante obtener la clase interna correcta. Tuve problemas para mostrar Vistas en un TableRow para que se mostrara correctamente hasta que descubrí que no estaba pasando una instancia de TableRow.LayoutParams a setLayoutParams de la vista hija.

+3

¿Cómo crear la vista progra máticamente, pero al usar un archivo de diseño XML que usted específicamente escribió para esta nueva vista? – SK9

+8

@ SK9 Utilizaría un LayoutInflater, que puede obtener de un contexto, generalmente la actividad actual. Algo como: LayoutInflater myInflater = getLayoutInflater; Ver myView = myInflater.inflate (R.layout.myLayout, parent, false); –

+0

En realidad, getLayoutInflater() proviene de la clase Window (no del contexto), y es un método práctico en Activity. –

15

Ésta es tarde, pero esto puede ayudar a alguien :) :) Para la adición de la vista mediante programación tratar como

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); 

Esto creará toda su vista programmatcally. Puede agregar cualquier cantidad de vista como la misma. Espero que esto pueda ayudar. :)

34

para cualquier persona interesada sin embargo:

la mejor manera que he encontrado es utilizar el método estático inflar de vista.

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout); 

donde yourViewXML es algo así como R.layout.myView

Tenga en cuenta que se necesita un ViewGroup el fin de añadir una vista (es decir, cualquier diseño que se pueda imaginar)

a fin un ejemplo digamos que usted tiene un fragmento de la que ya se ha inflado vista y sabe que el punto de vista de la raíz es un diseño, y que desea agregar la vista que:

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); 
+0

También podría escribir un método estático, algo así como 'addView (Ver v) {// su código después de obtener vista}' que tomaría una vista encontrada usando 'findViewById (int resourceID)' o inflado como tu 'inflatedView' ... solo para expandir tu fragmento de ejemplo. – zgc7009

Cuestiones relacionadas