Tải giá trị thứ nguyên từ res / value / height.xml từ mã nguồn


337

Tôi muốn tải giá trị như nó là. Tôi có hai dimension.xmltập tin, một trong /res/values/dimension.xmlvà một trong /res/values-sw360dp/dimension.xml.

Từ mã nguồn tôi muốn làm một cái gì đó như

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Điều này hoạt động nhưng giá trị tôi nhận được nhân với hệ số mật độ màn hình (1,5 cho hdpi, 2.0 cho xhdpi, v.v.).

Tôi cũng đã cố gắng làm

getResources().getString(R.dimen.tutorial_cross_marginTop);

Điều này sẽ hoạt động trên nguyên tắc nhưng tôi nhận được một chuỗi kết thúc bằng "nhúng" ...


1
Tôi tự hỏi nếu đó là lỗi trong Android vì Tài nguyên có phương thức getDimensionPixelSize(int id)xác định chính xác rằng nó trả về Pixel, vì vậy getDimension(int id)nên trả về dp (đơn vị độc lập phụ thuộc), điều đó sẽ sẵn sàng để sử dụng, ví dụ như với ViewsetPadding
Paul Verest

Câu trả lời:


811

Trong tập tin dimens của tôi, tôi có

<dimen name="test">48dp</dimen>

Trong mã nếu tôi làm

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

điều này sẽ trả về 72 khi trạng thái tài liệu được nhân với mật độ của điện thoại hiện tại (48dp x 1.5 trong trường hợp của tôi)

chính xác như trạng thái tài liệu:

Lấy một chiều cho một ID tài nguyên cụ thể. Chuyển đổi đơn vị dựa trên DisplayMetrics hiện tại được liên kết với các tài nguyên.

vì vậy nếu bạn muốn giá trị dp chính xác như trong xml, chỉ cần chia nó với mật độ DisplayMetrics

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp sẽ là 48 bây giờ


3
Tôi nghĩ rằng các tài liệu đặc biệt không rõ ràng ở đây. "Chuyển đổi đơn vị dựa trên DisplayMetrics hiện tại được liên kết với các tài nguyên." khi tất cả những gì họ muốn nói là họ chuyển đổi thành pixel.
Trilarion

Nếu về cơ bản bạn sẽ loại bỏ hệ số nhân hiển thị, bạn cũng có thể chỉ cần xác định thứ nguyên của mình trong px. <dimen name = "test"> 48px </ dimen>. getDimension (R.dimen.test) sẽ trở lại 48.
Michael Peterson

Không hoạt động với tôi: stackoverflow.com/questions/55972518/ Kẻ
Alex

@Trilarion Tuy nhiên, họ không chỉ chuyển đổi thành pixel. Họ đang nói rằng dpsẽ cung cấp giá trị pixel được chia tỷ lệ so với tỷ lệ của đối tượng tài nguyên được sử dụng để truy xuất nó. Khi bạn có được nhiều cách khác nhau để có được tài nguyên, điều này sẽ phù hợp hơn. Để đơn giản, bạn có thể nghĩ nó liên quan đến tỷ lệ màn hình. Ngoài ra còn có sp, hoặc pixel liên quan đến kích thước văn bản hệ thống và pxhoặc pixel trực tiếp. Mỗi cái là khác nhau và có một mục đích khác nhau.
Giỏ hàng bị bỏ rơi


17

Các Resourcelớp còn có một phương pháp getDimensionPixelSize () mà tôi nghĩ sẽ phù hợp với nhu cầu của bạn.


24
Cái này sai! việc chuyển đổi số liệu cũng xảy ra getDimensionPixelSize()nếu bạn có thể giới thiệu các tài liệu mà nó nêu rõ Trả về Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammad Babar

Cái này sai. Việc chuyển đổi số liệu cũng xảy ra bằng phương pháp này.
Michael Peterson

14

Đối với những người chỉ cần lưu một số intgiá trị trong tài nguyên, bạn có thể làm như sau.

số nguyên

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

int defaultValue = getResources().getInteger(R.integer.default_value);

2
Cảm ơn bạn vì điều này, là nhiều hơn những gì tôi đang tìm kiếm mặc dù có thể không phải cho người khác, nhưng giải pháp này cung cấp thực sự cung cấp cho tôi một số cái nhìn sâu sắc về các lĩnh vực khác trong mã của tôi
JamisonMan111

11

Bạn có thể sử dụng getDimensionPixel Offerset () thay vì getDimension, vì vậy bạn không cần phải chuyển sang int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)


2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Tôi nghĩ rằng nó là tốt để có được giá trị theo độ phân giải nhưng nếu bạn không muốn làm điều này hãy cho điều này trong px .......

Pixel độc lập với mật độ (dp)

Một đơn vị pixel ảo mà bạn nên sử dụng khi xác định bố cục UI, để thể hiện kích thước hoặc vị trí bố cục theo cách độc lập với mật độ. Pixel độc lập với mật độ tương đương với một pixel vật lý trên màn hình 160 dpi, đây là mật độ cơ sở được hệ thống giả định cho màn hình mật độ "trung bình". Trong thời gian chạy, hệ thống xử lý một cách minh bạch bất kỳ tỷ lệ nào của các đơn vị dp, khi cần thiết,based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. Bạn phải luôn sử dụng các đơn vị dp khi xác định giao diện người dùng của ứng dụng, để đảm bảo hiển thị đúng giao diện người dùng của bạn trên màn hình với mật độ khác nhau.

Tôi nghĩ thật tốt khi thay đổi giá trị theo độ phân giải nhưng nếu bạn không muốn làm điều này thì hãy cho điều này trong px .......

tham khảo liên kết này

theo điều này

dp

Pixels độc lập với mật độ - Một đơn vị trừu tượng dựa trên mật độ vật lý của màn hình. Các đơn vị này có liên quan đến màn hình 160 dpi (số chấm trên mỗi inch), trên đó 1dp gần bằng 1px.When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.Tỷ lệ dp-pixel sẽ thay đổi theo mật độ màn hình, nhưng không nhất thiết phải theo tỷ lệ trực tiếp. Sử dụng các đơn vị dp (thay vì các đơn vị px) là một giải pháp đơn giản để làm cho kích thước chế độ xem trong bố cục của bạn thay đổi kích thước đúng cho các mật độ màn hình khác nhau. Nói cách khác, nó cung cấp tính nhất quán cho kích thước trong thế giới thực của các thành phần UI của bạn trên các thiết bị khác nhau.

px

Pixel - Tương ứng với các pixel thực tế trên màn hình. Đơn vị đo này không được khuyến nghị vì đại diện thực tế có thể khác nhau giữa các thiết bị; mỗi thiết bị có thể có số pixel trên mỗi inch khác nhau và có thể có nhiều hoặc ít hơn tổng số pixel có sẵn trên màn hình.


2

Sử dụng tiện ích mở rộng Kotlin

Bạn có thể thêm một phần mở rộng để đơn giản hóa quá trình này. Nó cho phép bạn chỉ cần gọi context.dp(R.dimen. tutorial_cross_marginTop)để nhận giá trị Float

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

Nếu bạn muốn xử lý nó mà không có ngữ cảnh, bạn có thể sử dụng Resources.getSystem():

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

Ví dụ: trên thiết bị xhdpi, sử dụng 24.dpđể nhận 12.0 hoặc 12.pxnhận 24

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.