2011-09-22 27 views
12

Ví dụ, trong một bố cục cụ thể tôi có XML sau đây:Khi nào nên sử dụng tệp dimens.xml trong Android?

xem
<GridView 
    android:id="@+id/gridView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="3dp" 
    android:columnWidth="48dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="spacingWidth" /> 

lưới này là cụ thể cho bố trí này và tôi không nghĩ rằng tôi sẽ được sử dụng bất kỳ quan điểm lưới khác với tính chất tương tự. Điều đó để nói rằng các giá trị thứ nguyên trong mã cụ thể cho chế độ xem lưới đó.

Tôi có nên chuyển chúng sang tệp dimens.xml hay không hoặc chỉ để chúng như thế? Nếu vậy, tôi có nên đặt các giá trị trong tệp dimens.xml chỉ khi giá trị đó được sử dụng trên nhiều bố cục không?

Trả lời

22

Tôi thả giá trị tham số vào một nguồn tài nguyên dimens.xml thường vì ba lý do:

  1. Tái sử dụng: Tôi cần nhiều vật dụng hoặc bố trí sử dụng các giá trị như nhau và tôi chỉ muốn thay đổi nó một lần khi cập nhật hoặc chỉnh trên ứng dụng
  2. Sự khác biệt về mật độ: Nếu tôi cần kích thước hơi nhỏ hơn hoặc lớn hơn từ ldpi -> hdpi hoặc nhỏ -> lớn
  3. Đọc trong từ mã: Khi tôi khởi tạo chế độ xem mã và muốn áp dụng một số kích thước tĩnh, đặt chúng trong dimens.xml dưới dạng "dp" hoặc "nhúng" cho phép tôi để có được giá trị được chia tỷ lệ trong mã Java với Resources.getDimensionPixelSize()

HTH!

+0

Giới thiệu về # 2, làm thế nào để bạn phân biệt trong tệp 'dimens.xml' (cung cấp ví dụ nếu có thể)? Lý do 3 rất thuyết phục. –

+0

@Nghe nhiều tệp trong các thư mục đủ điều kiện. Ví dụ, đặt một 'dimens.xml' trong' res/values' cho các giá trị mặc định và một giá trị khác trong 'res/values-ldpi' bao gồm số ít tôi muốn ghi đè cho các thiết bị mật độ thấp. – Devunwired

+0

Tôi cho rằng chỉ có sẵn cho thư mục drawables. Cảm ơn vì tiền hỗ trợ. –

2

Tệp dimens.xml được sử dụng để giữ tất cả các giá trị pixel được mã hóa cứng ở một nơi.

Bây giờ, mặc dù bạn không thể sử dụng nhiều lần các giá trị này ngay bây giờ, bạn vẫn nên đặt chúng trong dimens.xml để tham khảo trong tương lai. Bên cạnh đó, theo mô hình lập trình chuẩn Android giúp các nhà phát triển khác hiểu mã của bạn nhanh hơn. Điều này giống như số strings.xml nơi chúng tôi đặt String một số trong số đó chỉ được sử dụng một lần! :)

+2

Nó không hoàn toàn giống nhau, các chuỗi các tệp XML cũng cho phép quốc tế hóa, do đó, có ý nghĩa hơn để chúng tách biệt khỏi mã. –

+1

Loại nhận xét đó là gì? –

+0

Xin lỗi nếu tôi không tự làm rõ. Ý tôi là, nhận xét của bạn đã không thực sự giúp câu hỏi của Bài đăng gốc cũng như nó hoàn toàn liên quan đến bài đăng của tôi. Tôi chỉ trung thực! :) –

1

câu trả lời bổ sung

danh sách @Devunwired 3 lý do để sử dụng dimens.xml. Dưới đây là chi tiết về cách thực hiện điều đó.

1. Tái sử dụng

Nếu bạn thiết lập một số dp hoặc sp giá trị trong dimens.xml một lần như thế này

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="textview_padding">16dp</dimen> 
    <dimen name="large_text_size">30sp</dimen> 
</resources> 

bạn có thể tái sử dụng nó trong suốt ứng dụng của bạn trong nhiều địa điểm.

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

Sau đó, khi cần thay đổi, bạn chỉ cần thực hiện ở một nơi.

Ghi chú

  • này về cơ bản là tác dụng tương tự như sử dụng một phong cách hoặc chủ đề.
  • Cẩn thận không cho hai chế độ xem khác nhau với cùng giá trị dimen nếu chúng thực sự không nên.Nếu bạn cần thực hiện thay đổi cho một tập hợp chế độ xem nhưng không phải là một lượt xem khác, thì bạn sẽ phải quay lại từng chế độ xem một cách riêng biệt, điều này sẽ đánh bại mục đích.

2. Kích Difference

  • @Devunwired gọi này khác biệt Mật độ, nhưng nếu bạn đang sử dụng dp (mật độ điểm ảnh độc lập), điều này đã được chăm sóc là những vấn đề chênh lệch mật độ cho tất cả nhưng các trường hợp nhỏ nhất. Vì vậy, theo ý kiến ​​của tôi, kích thước màn hình là một yếu tố quan trọng hơn để sử dụng dimens.xml.

Đệm có thể trông tuyệt vời trên điện thoại, nhưng khi ứng dụng chạy trên máy tính bảng, nó trông quá hẹp. Bạn có thể giải quyết vấn đề này bằng cách tạo hai (hoặc nhiều) phiên bản khác nhau của dimens.xml.

Nhấp chuột phải vào thư mục res và chọn Mới> Tệp tài nguyên giá trị. Sau đó, viết trong dimens và chọn Chiều rộng màn hình nhỏ nhất. Viết trong cho chiều rộng (7 ”máy tính bảng). (Có nhiều cách khác của việc lựa chọn kích cỡ. Xem documentationthis answer để biết thêm.)

enter image description here

này sẽ thực hiện một values thư mục đó sẽ được sử dụng cho các thiết bị có màn hình nhỏ nhất chiều rộng là 600dp. Trong giao diện Android, hai tệp dimens.xml trông giống như thế này.

enter image description here

Bây giờ bạn có thể sửa đổi chúng một cách độc lập.

giá trị/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">16dp</dimen> 
</resources> 

giá trị-sw600dp/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">64dp</dimen> 
</resources> 

Khi sử dụng của bạn dimen bạn chỉ cần cài đặt nó với tên mà bạn sử dụng trong cả hai tệp dimens.xml.

<LinearLayout 
    ... 
    android:padding="@dimen/my_default_padding"> 

</LinearLayout> 

Hệ thống sẽ tự động chọn đúng giá trị cho bạn tùy thuộc vào thiết bị mà người dùng đang sử dụng.

3. Đọc sách trong từ mã

Đôi khi nó là một nỗi khổ rộng theo chương trình giữa pxdp (xem this answer trong bao).

Nếu bạn có một giá trị cố định dp đã được xác định trong dimens.xml như thế này

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_dp_value">16dp</dimen> 
</resources> 

Sau đó, bạn có thể dễ dàng có được nó với

int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value); 

và nó đã sẽ được chuyển đổi sang pixel cho bất cứ thiết bị mật độ người dùng có.

+0

điều này rất hữu ích. bạn có biết cách buộc Android Studio chọn một tệp dimens.xml cụ thể để sử dụng trong khi xem trước bố cục không? Tôi đang gặp sự cố khi thiết lập tệp cho phong cảnh Samsung S7 - Tôi đã tạo tệp giá trị sw640dp nhưng bản xem trước đang chọn mặc định. –

+0

@orionelenzil, tôi không biết về bản xem trước bố cục. Bạn có thể thử hỏi một câu hỏi mới về điều này. Tôi sẽ nói rằng 'sw600dp' là một thiết lập tiêu chuẩn hơn' sw640dp'. Đây là chiều rộng nhỏ nhất, vì vậy '600' sẽ bao gồm' 640' và bất kỳ kích thước lớn nào khác. Ngoài ra, miễn là bạn đang nhận được kích thước chính xác khi chạy ứng dụng trong trình giả lập hoặc thiết bị, tôi không nghĩ rằng nó thực sự quan trọng nếu bản xem trước không hoạt động. – Suragch

+0

cảm ơn @Suragch. Tôi đã đăng một câu hỏi mới [ở đây] (https://stackoverflow.com/questions/49138505/android-difficulty-working-with-dimens-xml-files). –

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