2010-03-18 16 views
10

Sto provando ad aggiungere viste dinamicamente a una visualizzazione lineare. Vedo attraverso getChildCount() che le viste vengono aggiunte al layout, ma anche invocare invalidate() sul layout non mi dà i childs mostrati.Aggiornamento di un LinearLayout dopo l'aggiunta di una vista

Mi manca qualcosa?

+1

Mostraci del codice, perché potresti sbagliare. – Pentium10

+0

I Basta creare una vista, aggiungerla alla linearlayout e chiamare invalidate(). – lbedogni

risposta

19

Un paio di cose che si possono verificare nel codice:

  • Sul View che viene aggiunto, verificare che si chiama il suo metodo setLayoutParameter con un appropriato ViewGroup.LayoutParameter.
  • Quando si aggiungono i nuovi View s, assicurarsi che lo si stia facendo sul thread dell'interfaccia utente. Per fare ciò, è possibile utilizzare il metodo post genitore post genitore.

Questo autonomo esempio aggiunge una TextView dopo un breve ritardo quando si inizia:

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class ProgrammticView extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final LinearLayout layout = new LinearLayout(this); 
     layout.setLayoutParams(new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.FILL_PARENT, 
       ViewGroup.LayoutParams.FILL_PARENT)); 

     setContentView(layout); 

     // This is just going to programatically add a view after a short delay. 
     Timer timing = new Timer(); 
     timing.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       final TextView child = new TextView(ProgrammticView.this); 
       child.setText("Hello World!"); 
       child.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.FILL_PARENT, 
         ViewGroup.LayoutParams.WRAP_CONTENT)); 

       // When adding another view, make sure you do it on the UI 
       // thread. 
       layout.post(new Runnable() { 

        public void run() { 
         layout.addView(child); 
        } 
       }); 
      } 
     }, 5000); 
    } 
} 
+0

Faccio nuove forme all'interno di un gestore. Il fatto strano è che la prima forma è disegnata sul linearlayout, ma i successivi non lo sono. – lbedogni

+0

verifica di aver aggiunto android: orientation = "vertical" a LinearLayout – karabara

2

Ho avuto lo stesso problema e ho notato che il mio metodo di sovresposta onMeasure() non è stato chiamato dopo l'invalidate. Così ho creato la mia subroutine nel LinearLayout e l'ho chiamata prima del metodo invalidate().

Ecco il codice per un LinearLayout verticale:

private void measure() { 
    if (this.getOrientation() == LinearLayout.VERTICAL) { 
     int h = 0; 
     int w = 0; 
     this.measureChildren(0, 0); 
     for (int i = 0; i < this.getChildCount(); i++) { 
      View v = this.getChildAt(i); 
      h += v.getMeasuredHeight(); 
      w = (w < v.getMeasuredWidth()) ? v.getMeasuredWidth() : w; 
     } 
     height = (h < height) ? height : h; 
     width = (w < width) ? width : w; 
    } 
    this.setMeasuredDimension(width, height); 
} 
+0

dove hai ottenuto altezza, larghezza? –

0

ho speso un sacco di tempo per risolvere anche questo problema. E ho trovato un metodo semplice di aggiornamento LinearLayout in 3 righe di codice

È necessario impostare il colore transperent in style.xml

<color name="transparent">#00000000</color> 

E nel codice appena chiamata per impostare lo sfondo

LinearLayout ll = (LinearLayout) findViewById(R.id.noteList); 
ll.setBackgroundColor(getResources().getColor(R.color.transparent)); 
ll.invalidate(); 

Se hai sfondo richiamabile

ll.setBackgroundResource(R.drawable.your_drawable); 
Problemi correlati