2011-11-13 52 views
19

Tôi có chế độ xem tùy chỉnh được mở rộng từ View. Có 3 điểm cấu trúc:nhà xây dựng nào được gọi để xem?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

Từ hoạt động của tôi, tôi gọi std.setContentView(R.layout.main). Nhà xây dựng thứ hai đang được gọi theo quan điểm của tôi. Tại sao thứ hai? Làm thế nào để biết trước cái nào sẽ được gọi và tại sao?

Trả lời

41

Từ trang web của nhà phát triển Android dưới tài liệu cho xem:

public View (Context context)

constructor đơn giản để sử dụng khi tạo một cái nhìn từ mã.

Vì vậy, hàm tạo này là những gì bạn có thể sử dụng để tạo Chế độ xem trong Java. Nó sẽ không được gọi khi bạn thổi phồng từ XML.

public View (Context context, AttributeSet attrs)

Constructor đó được gọi là khi lạm phát một cái nhìn từ XML. Điều này được gọi khi một khung nhìn đang được xây dựng từ một tệp XML, cung cấp các thuộc tính được chỉ định trong tệp XML. Phiên bản này sử dụng kiểu mặc định là 0, do đó, các giá trị thuộc tính duy nhất được áp dụng là các giá trị trong Chủ đề của bối cảnh và thuộc tính đã cho.

Phương thức onFinishInflate() sẽ được gọi sau khi tất cả trẻ em đã được thêm vào.

Vì vậy, hàm tạo này sẽ được gọi khi bạn tăng lượt xem từ XML khi bạn không chỉ định kiểu.

public View (Context context, AttributeSet attrs, int defStyle)

Thực hiện lạm phát từ XML và áp dụng một phong cách cơ sở đẳng cấp cụ thể. Hàm khởi tạo này của Chế độ xem cho phép các lớp con sử dụng kiểu cơ sở của riêng chúng khi chúng đang tăng. Ví dụ, một hàm tạo của lớp Button sẽ gọi phiên bản này của hàm tạo lớp siêu và cung cấp R.attr.buttonStyle cho defStyle; điều này cho phép kiểu nút của chủ đề sửa đổi tất cả các thuộc tính khung nhìn cơ sở (đặc biệt là nền của nó) cũng như các thuộc tính của lớp Button.

Bạn nên thực hiện tất cả các nhà thầu, nhưng bạn có thể đặt tất cả các công việc trong một phần ba bằng cách gọi this(context, null)this(context, attrs, 0) cho hai người đầu tiên, tương ứng.

+2

siêu (ngữ cảnh, attrs) và siêu (ngữ cảnh, attrs, 0) hoạt động khác biệt đối với tôi. Đầu tiên là ok, nhưng thứ hai loại bỏ phong cách ban đầu từ một cái nhìn, vì vậy tôi không thể sử dụng này (bối cảnh, attrs, 0). Có phải là lỗi trong các phiên bản Android mới hơn không? – broot

+1

Xin vui lòng không cascade constructor cuộc gọi, xem câu trả lời của tôi dưới đây. – Jin

+0

Tôi cho rằng đây là câu trả lời của Jin: http://stackoverflow.com/a/34301725/326874 – aeracode

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