2010-03-18 9 views
10

Ich versuche, Ansichten dynamisch zu einem linearen Layout hinzuzufügen. Ich sehe durch getChildCount(), dass die Ansichten zum Layout hinzugefügt werden, aber selbst Aufruf von invalidate() auf dem Layout gibt mir die Childs nicht angezeigt.Aktualisieren eines LinearLayouts nach dem Hinzufügen einer Ansicht

Fehle ich etwas?

+1

Zeigen Sie uns etwas Code, da Sie es möglicherweise falsch machen könnten. – Pentium10

+0

I Erstellen Sie einfach eine Ansicht, fügen Sie sie zum linearen Layout hinzu und rufen Sie invalidate() auf. – lbedogni

Antwort

19

Ein paar Dinge, die Sie in Ihrem Code überprüfen:

  • Auf den View, die hinzugefügt wird, überprüfen Sie, dass Sie seine setLayoutParameter Methode mit einer geeigneten ViewGroup.LayoutParameter nennen.
  • Wenn Sie die neuen View s hinzufügen, stellen Sie sicher, dass Sie dies im UI-Thread tun. Zu diesem Zweck können Sie die Viewpost Methode verwenden.

Dieses in sich geschlossene Beispiel eine TextView nach einer kurzen Verzögerung hinzufügt, wenn es beginnt:

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

Ich mache neue Formen in einem Handler. Die seltsame Tatsache ist, dass die erste Form auf dem linearen Layout gezeichnet wird, aber die nächsten nicht. – lbedogni

+0

überprüfen Sie, dass Sie Android hinzugefügt haben: orientation = "vertikal" zu LinearLayout – karabara

2

Ich hatte das gleiche Problem und bemerkte, dass meine überschriebenen onMeasure() -Methode nicht nach dem Invalidier aufgerufen wurde. Also habe ich meine eigene Subroutine im LinearLayout erstellt und vor der invalidate() -Methode aufgerufen. Hier

ist der Code für eine vertikale Linearlayout:

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

wo haben Sie Höhe, Breite? –

0

ich viel Zeit damit verbracht, zu, dieses Problem zu lösen. Und ich fand eine einfache Methode Refresh-Linearlayout in 3 Zeilen Code

Sie transperent Farbe in style.xml setzen müssen

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

und im Code nur den Hintergrund einstellen rufen

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

Wenn Sie einen Hintergrund im Hintergrund haben, rufen Sie an:

ll.setBackgroundResource(R.drawable.your_drawable);