2010-03-07 19 views
126

Diciamo che ho un LinearLayout e voglio aggiungere una vista ad esso, nel mio programma dal codice Java. Quale metodo è usato per questo? Non sto chiedendo come è fatto in XML, che so, ma piuttosto, come posso fare qualcosa sulla falsariga di questo?Come aggiungere le viste alle viste a livello di programmazione

(One View) .add (Another View)

Come si può fare in Swing.

risposta

186

Chiamare addView è la risposta corretta, ma è necessario fare un po 'di più per farlo funzionare.

Se si crea una visualizzazione tramite un costruttore (ad esempio, Button myButton = new Button();), avrete bisogno di chiamare setLayoutParams sulla vista di nuova costruzione, passando in un'istanza di LayoutParams della vista genitore classe interna, prima di aggiungere il vostro bambino di nuova costruzione alla vista genitore.

Ad esempio, si potrebbe avere il seguente codice nel tuo onCreate() funzione supponendo che il LinearLayout ha id 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); 

Facendo in modo di impostare i LayoutParams è importante. Ogni vista richiede almeno un parametro layout_width e un layout_height. Anche ottenere la giusta classe interiore è importante. Ho fatto fatica a ottenere visualizzazioni aggiunte a un TableRow per visualizzarle correttamente finché non ho capito che non stavo passando un'istanza di TableRow.LayoutParams al setLayoutParams della vista figlia.

+3

Come ti creare il progra vista mmaticamente ma utilizzando un file di layout XML che hai specificamente scritto per questa nuova vista? – SK9

+8

@ SK9 Si utilizzerà un LayoutInflater, che è possibile ottenere da un contesto, in genere l'attività corrente. Qualcosa come: LayoutInflater myInflater = getLayoutInflater; Visualizza myView = myInflater.inflate (R.layout.myLayout, parent, false); –

+0

In realtà getLayoutInflater() deriva dalla classe Window (non da Context) ed è un metodo di convenienza in Activity. –

15

Questo è in ritardo, ma questo può aiutare qualcuno :) :) Per aggiungere la vista di programmazione provare come

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

Questo creerà la vostra intera vista programmatcally. Puoi aggiungere qualsiasi numero di visualizzazione come uguale. Spero che questo possa aiutare. :)

34

per chiunque sia ancora interessato:

il modo migliore che ho trovato è quello di utilizzare il metodo statico gonfiare di vista.

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

dove yourViewXML è qualcosa di simile R.layout.myView

prega di notare che è necessario un ViewGroup al fine di aggiungere una vista (che è qualsiasi layout che si può pensare)

in modo da un esempio diciamo che avere un frammento che è vista già stato gonfiato e si sa che la vista di root è un layout, e si desidera aggiungere una vista ad esso:

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

Si potrebbe anche scrivere un metodo statico, qualcosa come 'addView (View v) {// codice dopo la visualizzazione}' che richiederebbe una vista trovata usando 'findViewById (int resourceID)' o gonfiato come il tuo 'inflatedView' ... solo per espandere il tuo esempio di frammento. – zgc7009

Problemi correlati