2011-11-08 32 views
7

Trước hết nền của tôi: Tôi mới sử dụng Java từ Ruby. Nếu điều đó có ích.Tại sao các tham số bố cục hoạt động trong Lập trình Android?

Tôi nhầm lẫn về cách các tham số bố cục hoạt động. Tôi đang theo dõi giới thiệu Hello World cơ bản để tạo một Ứng dụng Android. Bước 1, mở rộng lớp Activity và phương thức onCreate() để truy cập vào bố trí XML. Ok tôi hiểu rồi.

Sau đó, tôi tạo bố cục (nói một RelativeLayout) trong Main.XML. Vì vậy, đây là việc sử dụng lớp RelativeLayout mở rộng lớp ViewGroup, cho đến nay. Sau đó, cho phép nói rằng tôi tạo ra một nút bên trong này. Đây là nơi câu hỏi của tôi bắt đầu. Nếu tôi xem ví dụ tôi đang theo dõi, tôi thấy các thuộc tính được gán cho nút thuộc về lớp RelativeLayout (ví dụ: android: layout_alignParentRight = "true"). Đây dường như là các tham số bố cục. Nhưng tại sao điều này lại hiệu quả? Lớp nút dường như kế thừa từ lớp View. Tại sao một đối tượng nút có thể chấp nhận các thuộc tính cho đối tượng RelativeLayout? Có lẽ chương trình Ruby của tôi làm tôi bối rối ..

Cảm ơn!

Cập nhật: Vì lợi ích: cảm ơn bạn với Slothsberry vì đã chỉ ra liên kết XML Layouts, có vẻ như mô tả câu trả lời rõ ràng trong 2 phần trong "Thuộc tính" và "Tham số bố cục". Phần thuộc tính sẽ đọc:

Mỗi đối tượng View và ViewGroup hỗ trợ nhiều thuộc tính XML riêng. Một số thuộc tính cụ thể cho đối tượng Chế độ xem (đối với ví dụ , TextView hỗ trợ thuộc tính textSize), nhưng các thuộc tính này cũng được thừa hưởng bởi bất kỳ đối tượng Chế độ xem nào có thể mở rộng lớp này. Một số là phổ biến cho tất cả các đối tượng View, vì chúng được thừa hưởng từ lớp View gốc (như thuộc tính id). Và, các thuộc tính khác được coi là "thông số bố cục", là thuộc tính mô tả định hướng bố cục nhất định của đối tượng Chế độ xem, như được xác định bởi đối tượng ViewGroup của đối tượng đó.

Phần thông số bố cục mặc dù có lẽ là phần thực sự trả lời câu hỏi này. Vị trí của tiểu bang:

Mỗi lớp ViewGroup thực hiện một lớp lồng nhau mở rộng ViewGroup.LayoutParams. Phân lớp này chứa các loại thuộc tính mà xác định kích thước và vị trí cho mỗi chế độ xem con, nếu thích hợp cho nhóm chế độ xem. Như bạn có thể thấy trong hình 1, nhóm xem phụ huynh xác định các tham số bố cục cho mỗi chế độ xem con (bao gồm cả trẻ em nhóm xem).

Chúng cũng cung cấp biểu đồ đẹp. Dường như một lập trình viên bắt đầu cần nhận ra rằng trong khi các lớp Java được tham chiếu, XML hoạt động giống như một trang CSS và các thuộc tính đó được tính toán lần đầu tiên trước khi được tính toán và chuyển sang các đối tác lớp Java của chúng. Đó là sự hiểu biết hiện tại của tôi anyways :)

+0

Không, bạn đúng khi nghĩ điều này thật lạ. Tôi đã được lập trình trong java trong hơn 5 năm, và đây là một cái gì đó mà khi tôi lần đầu tiên nhìn thấy nó không có ý nghĩa với tôi. Tôi vẫn không chắc tại sao nó lại hoạt động như thế này. Hy vọng rằng chúng tôi sẽ nhận được một câu trả lời. –

+0

https://developer.android.com/reference/android/view/View.html#Layout – samosaris

Trả lời

6

Thông số bố cục không phản ánh đúng sự thừa hưởng đối tượng (như bạn đã nhận thấy). Lý do là có hai phần bố cục: định cấu hình chế độ xem và tham số cha mẹ của chế độ xem bằng cách sử dụng chế độ xem đó làm đối số.

Vì vậy, các thông số như android: layout_below sẽ bị bỏ qua nếu bố cục gốc không phải là RelativeLayout. Nó có thể có ý nghĩa từ một quan điểm OOP để đặt tham số đó trong đối tượng RelativeLayout. Nhưng đó là cách bạn sẽ làm điều đó trong mã java.

Trong mã XML, cần có cách tiếp cận rằng thông tin về đứa trẻ được chứa trong trẻ. thông số bố cục yêu cầu cha mẹ không có mặt sẽ bị bỏ qua khi bố cục được tăng cao. Một hệ thống android tốt đẹp của nó sử dụng để làm cho XML dễ đọc hơn và di động hơn. Và nó không đề cập đến cấu trúc gói lớp học, mà là cách trực quan con người nghĩ về việc đặt mọi thứ trong một bố cục.

+0

Cảm ơn bạn, bạn hiểu rõ sự hiểu biết sai của tôi và đưa ra một câu trả lời tuyệt vời. Tôi đã thêm các ghi chú trong câu hỏi của tôi vì lợi ích của hậu thế dựa trên một số bài đọc thêm. Cảm kích điều đó. – Inc1982

+1

Hiểu bố cục 'lạm phát' có vẻ là chìa khóa để hiểu rõ hơn .. một số đọc thêm tôi tìm thấy dựa trên câu trả lời của bạn: http://www.androidguys.com/2008/07/09/inflation-is-a-good -thing/ – Inc1982

+0

Tôi tin rằng các thuộc tính layout được thừa hưởng một cách nghiêm ngặt, tương tự như thừa kế lớp.Tuy nhiên, những gì Android làm với chúng dường như khác nhau, tùy thuộc vào (ít nhất) yếu tố cha mẹ. Nói chung, kể từ khi bạn xây dựng bố trí từ gốc xuống (trừ khi bạn đang sử dụng lại bao gồm, có thuộc tính riêng của họ đã được thiết lập), bạn chỉ có thể bỏ qua các thuộc tính không phù hợp cho các yếu tố của bạn. Tôi thậm chí đã không nhận thấy rằng layout_below đã có sẵn tất cả các thời gian, kể từ khi tôi không bao giờ nhìn vào nó, trừ khi tôi đã ở trong một RelativeLayout –

1

bạn hơi bối rối, thông số bố cục đó không sở hữu một đối tượng XML cụ thể. Nếu bạn đặt nó trong một con XXXView hoặc XXXLAyout con, nó sẽ hiểu rằng bên phải của nó phải ở cùng một vị trí hơn so với quyền cha mẹ.

Sau đó, nếu bạn không tạo thông số bố cục cho đứa trẻ đó, đứa trẻ sẽ cố gắng kế thừa các thông số của cha mẹ.

+0

Cảm ơn bạn đã trả lời. Có lẽ bạn có thể giúp tôi hiểu từ góc độ Android/Java. Đối tượng trong Android có thuộc tính, phải không? Tôi cho rằng tất cả các thuộc tính đều có một đối tượng sở hữu, đúng không? Khi tôi tạo một thẻ nút, bạn đang nói rằng không phải tất cả các thuộc tính được xác định trong thẻ nút đều thuộc về đối tượng nút. Đúng không? – Inc1982

+0

nó phụ thuộc vào nơi bạn đặt nó. Bạn phải nghĩ rằng chính đối tượng đó phải nằm trong một vùng chứa khác. Sau đó, bạn tuân theo để cho đối tượng biết vị trí tương đối của cha mẹ mình. Tất nhiên chúng tôi chỉ nói về bố cục tương đối. Nó không khác với lập trình CSS. Hơn nữa, cũng tồn tại một thẻ XML khác cho trẻ biết cách đặt hàng vào cha mẹ. Hệ thống này linh hoạt cho những thứ đó. –

3

Tất cả các yếu tố bố cục trong Android kế thừa từ Chế độ xem, mặc dù nhiều gián tiếp.

Lớp Chế độ xem chung có các thuộc tính (thuộc tính) thích hợp cho bất kỳ phần tử bố cục hiển thị nào. đối với bố cục gốc, một số thuộc tính như Layout Gravity, kích thước Layout, vv được thiết lập bởi hệ thống (trong hầu hết các trường hợp tôi tin).

Nếu bố cục gốc của tôi là bố cục tuyến tính, Android sẽ cho phép tôi có bố cục tương đối là con trong thư mục gốc. Android sẽ cho phép tôi đặt các thuộc tính bố cục khác nhau trên phần tử lồng nhau, để kiểm soát cách nó hiển thị. Điều này làm việc tương tự cho Button và bất kỳ bố cục Android nào khác.

Nếu bạn không quan tâm đến một thuộc tính cụ thể, đừng đặt nó. Chúng có mặt để cho phép bạn kiểm soát các màn hình ứng dụng của mình. Hãy xem xét XML Layouts hoặc Hello Views để giúp bạn bắt đầu chi tiết.

+0

Cảm ơn bạn đã thêm vào cuộc thảo luận. Trong khi tôi không thể mò mẫm vấn đề từ câu trả lời của bạn, liên kết của bạn với XML Layouts đã cho tôi những gì tôi cần. Tôi đã cập nhật câu hỏi của mình ở trên để bao gồm những gì tôi đã giải quyết được sự hiểu biết của mình. Bạn có thể cho tôi biết nếu điều đó có vẻ đúng. :) – Inc1982

0

Layout

Bố cục là một quá trình vượt qua: một thước đo và vượt qua bố cục. Vé đo được thực hiện trong measure(int, int) và là giao điểm trên xuống của cây xem. Mỗi khung nhìn đẩy thông số kỹ thuật kích thước xuống cây trong quá trình đệ quy. Khi kết thúc đo lường, mỗi lượt xem đã lưu trữ số đo của nó. Bước thứ hai xảy ra trong layout(int, int, int, int) và cũng từ trên xuống dưới. Trong thời gian này, mỗi phụ huynh chịu trách nhiệm định vị tất cả các con của mình bằng cách sử dụng các kích thước được tính toán trong phép đo.

Khi một cái nhìn biện pháp() trở về phương pháp, getMeasuredWidth()getMeasuredHeight() giá trị của nó phải được thiết lập, cùng với những người cho tất cả các con cháu của quan điểm đó. Chiều rộng đo được đo và giá trị độ cao được đo phải tôn trọng các ràng buộc do cha mẹ của chế độ xem áp đặt. Điều này đảm bảo rằng vào cuối của các biện pháp vượt qua, tất cả các bậc cha mẹ chấp nhận tất cả các phép đo của con em họ. Chế độ xem gốc có thể gọi số đo() nhiều hơn một lần đối với con của nó. Ví dụ, phụ huynh có thể đo mỗi đứa trẻ một lần với kích thước không xác định để tìm hiểu xem chúng muốn lớn như thế nào, sau đó gọi lại số đo() trên số đó nếu số tiền của tất cả các kích thước không bị giới hạn của trẻ quá lớn hoặc quá nhỏ.

Thước đo sử dụng hai lớp để giao tiếp thứ nguyên. Lớp View.MeasureSpec được sử dụng theo lượt xem để cho cha mẹ biết cách đo và định vị chúng. Lớp LayoutParams cơ sở chỉ mô tả mức độ lớn mà khung nhìn muốn cho cả chiều rộng và chiều cao.Đối với mỗi kích thước, nó có thể chỉ định một trong số:

  • một con số chính xác
  • MATCH_PARENT, có nghĩa là xem muốn trở thành lớn như nó mẹ (trừ đệm)
  • wrap_content, có nghĩa là xem muốn chỉ đủ lớn để kèm theo nội dung của nó (cộng với phần đệm).

Có các lớp con của LayoutParams cho các lớp con khác nhau của ViewGroup. Ví dụ, AbsoluteLayout có lớp con của riêng nó của LayoutParams mà thêm một giá trị X và Y.

Số đoSpec được sử dụng để đẩy các yêu cầu xuống cây từ cha mẹ sang con. Một MeasureSpec có thể ở một trong ba chế độ:

  • UNSPECIFIED: Điều này được cha mẹ sử dụng để xác định kích thước mong muốn của chế độ xem con. Ví dụ, LinearLayout có thể gọi số trên con của nó với chiều cao được đặt thành UNSPECIFIED và chiều rộng chính xác 240 để tìm hiểu xem độ cao của trẻ muốn được cấp chiều rộng là 240 pixel.
  • CHÍNH XÁC: Điều này được cha mẹ sử dụng để áp đặt kích thước chính xác trên con số . Đứa trẻ phải sử dụng kích thước này và đảm bảo rằng tất cả các con cháu của nó sẽ vừa với kích thước này.
  • AT_MOST: Điều này được cha mẹ sử dụng để áp đặt kích thước tối đa trên con số . Đứa trẻ phải đảm bảo rằng nó và tất cả các hậu duệ của nó sẽ phù hợp với kích thước này.

Để bắt đầu bố cục, hãy gọi requestLayout(). Phương pháp này thường được gọi bởi một khung nhìn trên chính nó khi nó tin rằng đó là không còn có thể phù hợp trong giới hạn hiện tại của nó.

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