Tôi đang viết một ứng dụng với mục đích duy nhất là cố gắng hiểu cách phân cấp chế độ xem trong Android hoạt động. Tôi đang có một số vấn đề thực sự khắc nghiệt trong nó ngay bây giờ. Tôi sẽ cố gắng súc tích trong lời giải thích của tôi ở đây.Cố gắng hiểu cấu trúc phân cấp xem
Thiết lập:
Hiện tại tôi có ba Chế độ xem. 2 là ViewGroups
và 1 chỉ là View
. Hãy nói rằng họ theo thứ tự này:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
Trong Activity
của tôi, tôi chỉ đơn giản là hiển thị các quan điểm như vậy:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
vấn đề:
Phương pháp
onDraw(Canvas canvas)
của Testa là không bao giờ gọi là. Tôi đã nhìn thấy một vài giải pháp này nói rằng quan điểm của tôi không có bất kỳ kích thước (chiều cao/chiều rộng = 0), tuy nhiên, đây không phải là trường hợp. Khi tôi ghi đèonLayout()
, tôi nhận được kích thước bố cục của tôi và chúng đúng. Ngoài ra, getHeight()/Width() chính xác như chúng cần. Tôi cũng có thể ghi đè lên sốdispatchDraw()
và nhận các lượt xem cơ bản của mình để vẽ.Tôi muốn tạo ảnh động một đối tượng trong
TestB
. Theo truyền thống, tôi sẽ ghi đè lên phương pháponDraw()
trên cuộc gọiinvalidate()
trên chính nó cho đến khi đối tượng kết thúc hoạt ảnh mà nó được cho là phải làm. Tuy nhiên, trongTestB
, khi tôi gọiinvalidate()
chế độ xem không bao giờ được vẽ lại. Tôi có ấn tượng rằng đó là công việc của chế độ xem cha mẹ của tôi để gọi lại phương thứconDraw()
, nhưng chế độ xem gốc của tôi không gọi lại sốdispatchDraw()
.
Tôi đoán câu hỏi của mình là, tại sao phương pháp onDraw()
của bố mẹ tôi không bao giờ được gọi để bắt đầu? Phương pháp nào trong chế độ xem cha mẹ của tôi được cho là sẽ được gọi khi một trong số đó là con cái mất hiệu lực? Cha mẹ là người chịu trách nhiệm đảm bảo con của nó bị lôi cuốn hay Android có chăm sóc điều đó không? Nếu Android trả lời invalidate()
, tại sao số TestB
của tôi không bao giờ bị rút lại?
bạn có thể chia sẻ dự án demo này của Viewgroup trong blog của bạn hoặc một nơi nào đó nó sẽ rất hữu ích .. Cảm ơn bạn đời .. – user1201239
tôi có cần thêm childView ngay cả khi chúng tôi chỉ định nó trong XML không? – user1201239
Tôi xin lỗi. Tôi không có blog hoặc bất cứ thứ gì để tải lên. Tôi sẽ cố gắng hết sức hữu ích nhất có thể. Để trả lời câu hỏi đầu tiên của bạn, không. Khi bạn thổi phồng xml, con được chứa trong 'ViewGroup'. Đầu tiên bạn có thể lấy nó là 'onFinishInflate()'. Sau đó bạn có một sự lựa chọn. Hoặc là đưa con bạn qua phương thức 'getChildAt (int index)' hoặc sử dụng 'findViewById (int id)'. Chỉ mục sẽ là thứ tự các trẻ em được đặt trong xml. Tôi không biết cách lập chỉ mục hoạt động với trẻ em trong trẻ em. – DeeV