2010-03-18 36 views
10

Tôi đang cố gắng thêm chế độ xem động vào linearlayout. Tôi thấy thông qua getChildCount() rằng các khung nhìn được thêm vào bố trí, nhưng thậm chí gọi invalidate() trên layout không cho tôi các childs xuất hiện.Làm mới LinearLayout sau khi thêm một chế độ xem

Tôi có thiếu gì đó không?

+1

Hiển thị cho chúng tôi một số mã, như bạn có thể làm sai. – Pentium10

+0

Tôi chỉ cần tạo một khung nhìn, thêm nó vào linearlayout và gọi invalidate(). – lbedogni

Trả lời

19

Một vài điều bạn có thể kiểm tra trong mã của bạn:

  • Trên View đang được thêm vào, kiểm tra xem bạn gọi phương thức setLayoutParameter của nó với một thích hợp ViewGroup.LayoutParameter.
  • Khi bạn thêm View s mới, hãy đảm bảo bạn đang thực hiện nó trên chuỗi giao diện người dùng. Để thực hiện việc này, bạn có thể sử dụng phương thức post của cha mẹ View.

tự này chứa ví dụ thêm một TextView sau một khoảng thời gian ngắn khi nó bắt đầu:

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

Tôi tạo các hình dạng mới bên trong Trình xử lý. Thực tế kỳ lạ là hình dạng đầu tiên được vẽ trên linearlayout, nhưng hình dạng tiếp theo thì không. – lbedogni

+0

kiểm tra xem bạn đã thêm android: orientation = "vertical" vào LinearLayout – karabara

2

tôi đã cùng một vấn đề và nhận thấy rằng phương pháp onMeasure overriden của tôi() đã không được gọi sau khi vô hiệu. Vì vậy, tôi đã tạo ra chương trình con của riêng mình trong LinearLayout và gọi nó trước phương thức invalidate().

Đây là mã cho một LinearLayout dọc:

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

bạn đã nhận chiều cao, chiều rộng ở đâu? –

0

tôi đã dành rất nhiều thời gian để giải quyết vấn đề này quá. Và tôi tìm thấy một phương pháp đơn giản của refresh LinearLayout trong 3 dòng mã

Bạn phải thiết lập màu transperent trong style.xml

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

và trong các mã chỉ cần gọi để thiết lập nền

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

Nếu bạn có lệnh gọi nền có thể draw

ll.setBackgroundResource(R.drawable.your_drawable); 
Các vấn đề liên quan