[Android-02] LayoutParams trong Android
- Layout Params trong ứng dụng Android
Trong các ứng dụng của Android, LayoutParams hầu hết có mặt trong các màn hình.
Mỗi ViewGroup, ví dụ như LinearLayout, RelativeLayout, FrameLayout đều phải chứa thông tin của thuộc tính các thành phần con bên trong nó.
Những thông tin về các thuộc tính thành phần con bên trong các ViewGroup, được lưu trữ bằng Object của wrapper class ViewGroup.LayoutParams.
Để phân biệt các kiểu lyaout khác nhau, thì ViewGroup có những subclass riêng biệt để phân biệt, như là LinearLayout.Params, hoặc CoordinatorLayout,...
Hầu hết các ViewGroups sử dụng lại khả năng thiết đặt các margins cho các thành phần con bên trong nó, vì thế chúng không có subclass ViewGroup.LayoutParams chính xác để phân biệt từng thành phần con, nhưng subclass ViewGroup.MarginLayoutParams có thể làm được (bản thân nó là một subclass của ViewGroup.LayoutParams).
Sau đây là ví dụ:
LayoutParams object được tạo thành dựa trên file xml layout.
Tất cả những tham số bắt đầu với "layout_" sẽ chỉ định những layout kèm theo làm việc như thế nào. Khi layout được nhúng/khởi tạo, những tham số được đóng gói trong LayoutParams object, sẽ được sử dụng sau đó bởi thuộc tính vị trí Layout, là 1 phần đặc biệt của View trong ViewGroup. Những thuộc tính của 1 View được trỏ chính xác tới View-related và hoạt động trên chính nó.
Ví dụ ở trên, với TextView, layout_width, layout_height, layout_gravity được lưu trữ trong LinearLayout.LayoutParams object và sử dụng bởi LinearLayout.
Các thuộc tính như gravity, text, textColor được sử dụng sau đó bởi chính TextView.
Với ImageView, thì layout_width, layout_height, layout_weight sẽ được lưu trữ trong object LinearLayout.LayoutParams, và được sử dụng bởi LinearLayout. Còn những thuộc tính như background, scaleType, src được sử dụng sau đó bởi chính ImageView.
2. Lấy lại object LayoutParams như thế nào?
getLayoutParams là một phương thức của View, cho phép lấy object LayoutParam hiện tại.
Bởi vì object LayoutParams được related chính xác đến ViewGroup kèm theo, phương thức đó sẽ trả về non-null chỉ khi nào View đã được attached vào ViewGroup. Điều này đồng nghĩa với việc bạn sẽ phải ghi nhớ rằng object đó có thể không hiển thị ở mọi lúc mọi nơi. Đặc biệt nhất là bạn không nên phụ thuộc vào những thứ khởi tạo trong constructor của View, nếu là custom View, như ví dụ dưới đây:
Nếu bạn muốn lấy thuộc tính của LayoutParams, sử dụng phương thức getLayoutParams.
Nhưng nếu khởi gọi phương thức trong hàm setupView, bạn sẽ bị ném vào mặt một giá trị NULL rất bự.
Bắt buộc phải override phương thức onAttachedToWindow, tức là View đã được attach vào ViewGroup, và sử dụng phương thức để lấy thuộc tính sau đó, giá trị tra về sẽ là khác NULL. Nếu vẫn bằng NULL thì bạn hãy xem bạn có sử dụng nó chưa 😂
3. Cast LayoutParams object như thế nào?
3. Cast LayoutParams object như thế nào?
Bạn nên cần phải biết sử dụng tính năng này để có thể chỉ định phần riêng biệt của 1 ViewGroup. Tùy mục đích mà bạn cần phải biết làm như thế nào để cast ViewGroup.LayoutParams object. Hãy xem ví dụ bên dưới:
Có thể bạn sẽ phải lắc đầu không biết làm sao để lấy LayoutParams object trong trường hợp này mà View con thực chất cũng là 1 ViewGroup, tức là FrameLayout nằm trong LinearLayout, cả 2 đều là ViewGroup.
Có một điều ghi nhớ: Kiểu của LayoutParams Object sẽ liên quan chính xác đến ViewGroup đính kèm theo nó.
Khai thật đi, có phải bạn vừa đưa ra solution cho trường hợp này là như trên đúng không? 😁
Không chính xác. Theo câu thần chú của ông tổ sơ khai ViewGroup và logictics của nó, thì solution đúng phải là cast thằng con FrameLayout theo thằng cha, tức là LinearLayout.LayoutParams, như sau:
Đó mới là cách chính xác để cast từ con vào cha, mà trong khi cả 2 con và cha đều học chung 1 lớp. 😂
Nhận xét
Đăng nhận xét