Android đặt chiều cao và chiều rộng của Chế độ xem tùy chỉnh theo chương trình


128

Tôi đã tạo ra một chế độ xem tùy chỉnh có tên Graphview. Đây là cấu trúc cho lớp GraphView.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Tôi đã thêm chế độ xem trong tablerow bằng cách sử dụng addview(). Nó đang hoạt động tốt. Bây giờ tôi muốn đặt chiều cao và chiều rộng cho GraphView. Làm thế nào để làm điều đó?

Câu trả lời:


138

Cách dễ dàng là đặt kích thước theo chương trình như sau:

graphView.setLayoutParams(new LayoutParams(width, height));

Điều này là tốt nếu bạn biết kích thước chính xác của chế độ xem. Tuy nhiên, nếu bạn muốn có một cách tiếp cận linh hoạt hơn, bạn có thể ghi đè lên các onMeasure()phương pháp để đo lường xem một cách chính xác hơn tùy thuộc vào những hạn chế không gian có sẵn và bố trí ( wrap_content, match_parenthay một kích thước cố định).

Bạn có thể tìm thấy một ví dụ về cách ghi đè onMeasure()bằng cách xem tài liệu AndroidLabelViewmẫu trong thư mục SDK của bạn.


16
Sẽ rất hữu ích để biết LayoutParams nào bạn đang nhập ở đó.
dùng3690202

1
Các LayoutParamsnên từ cách bố trí nơi graphViewđược đặt. Ví dụ: nếu trong tệp bố cục XML graphViewđược đặt bên trong RelativeLayout, thì bạn nên sử dụngnew RelativeLayout.LayoutParams(width, height)
Vic

208

Bạn có thể đặt chiều cao và chiều rộng như thế này:

myGraphView.setLayoutParams(new LayoutParams(width, height));

76
Bạn nên chắc chắn rằng lớp LayoutParam bạn sử dụng là từ lớp Bố cục chính xác. Ví dụ: nếu GraphView của bạn được chứa trong linearLayout, bạn cần sử dụng lớp linearLayout.LayoutParams.
yincrash

41
Điều này cũng hoạt động và đảm bảo bạn sử dụng lớp LayoutParams chính xác: chỉ cần làm myGraphView.getLayoutParams().height = 100;.
sulai

21
Nếu bạn làm như vậy this.getLayoutParams().height = 100, hãy chắc chắn làm theo nó this.setLayoutParams(this.getLayoutParams()), nếu không nó sẽ không làm gì cả (hữu ích).
Achal Dave

4
Tôi nghĩ thật kỳ lạ khi câu trả lời này đang nhận được nhiều điểm hơn. Trong khi nó dễ dàng hơn, nó ít mô-đun hơn; nếu bạn muốn sử dụng chế độ xem của mình ở một nơi khác, bạn cũng cần mã hóa các giá trị chiều rộng / chiều cao đó. Hãy cẩn thận về việc sử dụng này.
vườn

1
Cảm ơn @yincrash đã chỉ ra điều đó. Có vẻ lạ khi tôi cần sử dụng lớp của chế độ xem cha (RelativeLayout trong trường hợp của tôi) thay vì lớp cha của chế độ xem tùy chỉnh của tôi (SurfaceView trong trường hợp của tôi) mặc dù
ericn

75

bạn có thể đặt chiều cao và chiều rộng của chế độ xem theo bố cục tương đối như thế này

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

2
bạn không cần thiết lập lại layoutparam. Nó được phản ánh tự động. Đây là lợi thế của phương pháp hướng đối tượng.
Dipendra

8
@Dipendra setLayoutParams()yêu cầu gọi đến vì nó gọi các phương thức khác như resolveLayoutParams()requestLayout()
William

đưa ra ngoại lệ như trong onCreate getLayoutParams () là giá trị null. Vì vậy, params. ngoại lệ gây ra ngoại lệ
Sibasish

Bạn nên tham khảo chế độ xem mà bạn phải đặt chiều cao. Kiểm tra xem bạn có đang chỉ vào cùng một chế độ xem không
Rakshi

1
Bắt đầu layoutParamstheo quan điểm sẽ là một NPE, vui lòng giải thích tại điểm nào để bạn chạy cái này?
John Sardinha

6

Trên Kotlin, bạn có thể đặt trực tiếp chiều rộng và chiều cao của bất kỳ chế độ xem nào bằng các thuộc tính ảo của chúng:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12là spinner của bạn và 200 , 120widthheightcho bạn spinner.


3

Đây là phiên bản dựa trên Kotlin, giả sử rằng chế độ xem cha là một thể hiện của LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Điều này cho phép đặt chiều rộng và chiều cao ( 100200) trong một dòng duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.