2010-05-19 42 views
11

Tôi có một bố trí trong đó xác định kích thước của widget trong chiều kích tương đối, ví dụ:Cách nhận kích thước của tiện ích con Android sau khi bố cục được tính toán?

<LinearLayout ... layout_height="fill_parent"> 
    <ImageView ... layout_height="wrap_content" /> 
    <TextView ... layout_height="120dp" /> 
</LinearLayout> 

Ngay sau khi onCreate, tôi muốn biết có bao nhiêu là chiều cao của ImageView. Làm thế nào để làm điều đó?

Lưu ý: Nếu tôi gọi getHeight() trong onCreate, tôi nhận được 0.

Tôi cũng đã cố gắng imageView.postDelayed, nó hoạt động trên 2.1 giả lập nhưng không thành công trên 1,5 giả lập (Tôi có 0, quá).

Cuối cùng, tôi đã cố gắng tạo một Handler và sau đó tôi gọi handler.postDelayed với thời gian trễ là 10 ms. Nó hoạt động trong cả trình giả lập 2.1 và 1.5, nhưng không thành công khi tôi khởi động chương trình trong trình gỡ rối eclipse (Vì vậy, tôi kết luận rằng việc sử dụng độ trễ không đảm bảo rằng việc nhận chiều cao xảy ra sau khi imageview là layout-ted.)

Trả lời

11

Lý do bạn nhận được kích thước bằng 0 là bố cục không được hoàn thành cho đến sau khi hoạt động được tạo hoàn toàn, tức là onCreate(), onStart() và onResume() đều đã hoàn thành. Cách dễ nhất tôi biết để có được kích thước chính xác là gọi phương thức của bạn sau khi bố cục đã hoàn tất, chẳng hạn như bằng cách sử dụng trình nghe nhấp chuột vào nút. Vì nút không được hiển thị cho đến khi bố cục hoàn tất, kích thước phải có sẵn vào thời điểm trình nghe nhấp chuột của nó được kích hoạt.

Đây chỉ là phỏng đoán, nhưng tôi cho rằng điều này khó thực hiện chính xác vì chúng không muốn mọi người rối tung với kích thước bố cục khi hệ thống vừa hoàn thành việc đặt màn hình. Nếu họ đã cung cấp một cuộc gọi lại "onLayoutFinished()", thì bạn có thể bị kẹt trong vòng lặp nếu bạn sửa đổi bố cục trong đó. Ví dụ: hãy tưởng tượng: bố cục được hoàn tất; onLayoutFinished() được gọi và bạn sửa đổi bố trí trong đó; bố cục hiện tại không hợp lệ; bố trí lại; onLayoutFinished() được gọi lại; mã của bạn được gọi lại - và vân vân.

Một cách khác để thực hiện là tạo Chế độ xem tùy chỉnh và ghi đè phương thức onMeasure(int, int). Hệ thống kích hoạt phương thức đó để có được kích thước của mỗi Chế độ xem; nếu bạn sử dụng một cái gì đó giống như ví dụ của tôi dưới đây, bạn có thể lấy gợi ý kích thước trước khi bố trí xong:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size 
} 

(tôi đã viết rằng đó là kích thước đề nghị vì tôi nghĩ rằng nó có thể cho kích thước phải được thay đổi sau Tuy nhiên, đó là một ký ức mơ hồ về những gì tôi đã đọc một lúc trước đây, và tôi chưa bao giờ thử nghiệm chi tiết.) Một khi bạn đã làm điều đó, bạn có thể sử dụng kích thước cho bất cứ điều gì bạn muốn làm - bạn thậm chí có thể thay đổi kích thước mà nó sẽ sử dụng bằng cách sử dụng setMeasuredDimension(newX, newY).

+0

Cảm ơn rất nhiều. Nghe có vẻ như vậy. Tôi sẽ cố gắng làm điều đó. – yuku

+2

Đây là một IMHO hạn chế lớn. Không thể nhận các biện pháp mà không ghi đè Chế độ xem hoặc Bố cục hoặc thêm nút mà bạn thực sự không cần. –

7

Đối tượng dạng xem cung cấp phương thức được gọi là onSizeChanged (int w, int h, int oldw, int oldh). Nó được gọi khi bố cục thay đổi kích thước của một trong các thành phần của nó. Nếu bạn ghi đè phương pháp này thì mã trong phiên bản của phương thức này sẽ biết kích thước của chính nó như được hiển thị trong đoạn mã sau.

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    bounds = new Rect(); 
    this.getDrawingRect(bounds); 
    // bounds will now contain none zero values 
} 
Các vấn đề liên quan