2010-03-18 6 views
10

J'essaie d'ajouter dynamiquement des vues à une présentation linéaire. Je vois à travers getChildCount() que les vues sont ajoutées à la mise en page, mais même en appelant invalidate() sur la mise en page ne me donne pas les enfants apparus.Actualisation d'un LinearLayout après l'ajout d'une vue

Ai-je raté quelque chose?

+1

Montrez-nous du code, car vous pourriez le faire mal. – Pentium10

+0

I Créez simplement une vue, ajoutez-la à linearlayout et appelez invalidate(). – lbedogni

Répondre

19

Un couple de choses que vous pouvez vérifier dans votre code:

  • Sur la View qui est ajouté, vérifiez que vous appelez sa méthode setLayoutParameter avec un ViewGroup.LayoutParameter approprié.
  • Lorsque vous ajoutez le nouveau View s, assurez-vous que vous le faites sur le thread UI. Pour ce faire, vous pouvez utiliser la méthode de View parent.

Cette autonome exemple ajoute un TextView après un court délai quand il commence:

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

Je fais de nouvelles formes à l'intérieur d'un Handler. Le fait étrange est que la première forme est dessinée sur la distribution linéaire, mais pas les suivantes. – lbedogni

+0

vérifier que vous avez ajouté Android: orientation = "vertical" à LinearLayout – karabara

2

J'ai eu le même problème et a remarqué que ma méthode surchargée de onMeasure() n'a pas été appelé après l'invalident. J'ai donc créé mon propre sous-programme dans LinearLayout et l'ai appelé avant la méthode invalidate().

Voici le code pour un LinearLayout vertical:

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

où avez-vous obtenu la hauteur, la largeur? –

0

J'ai passé beaucoup de temps pour résoudre ce problème aussi. Et j'ai trouvé une méthode simple de rafraîchissement LinearLayout en 3 lignes de code

Vous devez définir la couleur de transperent dans style.xml

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

Et dans le code appellent juste pour mettre en arrière-plan

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

Si vous avez appel en arrière-plan drawable

ll.setBackgroundResource(R.drawable.your_drawable); 
Questions connexes