2011-12-07 34 views
19

Tôi có một chuỗi nền cập nhật giao diện người dùng hoạt động của tôi, sau số onCreate(). Nó có thể được thêm bố trí, hoặc thay đổi kích thước của người khác.Làm thế nào để biết khi nào một hoạt động kết thúc một cách bố trí vượt qua?

Tôi chỉ muốn phát hiện khi vượt qua bố cục được hoàn thành trong hoạt động của mình, để có thể cập nhật thủ công vị trí của các chế độ xem khác trực tiếp phụ thuộc vào bố cục vừa được thêm hoặc sửa đổi.

Hiện tại, tôi chỉ sử dụng Handler với số postDelayed runnable thực hiện công việc sau một khoảng thời gian nhỏ, khoảng 50-100 ms sau khi các mô-đun kích hoạt requestLayout().

Nó hoạt động, nhưng chúng ta rõ ràng có thể thấy sự chậm trễ. Tôi muốn làm công việc càng sớm càng tốt. Trong mã xem, thật đơn giản để phát hiện phép đo, nhưng tôi không tìm cách giải quyết trực tiếp điều này trong hoạt động.

Trả lời

39

Một GlobalLayoutListener sẽ kích hoạt sự kiện khi hoàn tất bố cục. Điều đó có phù hợp với nhu cầu của bạn không?

View myView=findViewById(R.id.myView); 
    myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       //At this point the layout is complete and the 
       //dimensions of myView and any child views are known. 
      } 
     }); 
1

ngoài Phillip Fitzsimmons chấp nhận câu trả lời, đó là chính xác, tôi cũng xin lưu ý rằng nếu ai đó cần phải biết kích thước trong giao diện bản thân, phương pháp này:

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    // your code here 
} 

có thể được ghi đè và nó sẽ được gọi sau khi vượt qua layout.

+6

Mặc dù điều này là chính xác, tôi muốn thêm rằng điều này có thể được gọi hai lần hoặc thậm chí thường xuyên hơn trong một số bố cục, trong đó quá trình đo lường sẽ được gọi là đệ quy (trọng lượng, vv). – JacksOnF1re

Các vấn đề liên quan