Memuat nilai dimensi dari res / values ​​/ dimensional.xml dari kode sumber

337

Saya ingin memuat nilai apa adanya. Saya memiliki dua dimension.xmlfile, satu di /res/values/dimension.xmldan yang lain di /res/values-sw360dp/dimension.xml.

Dari kode sumber saya ingin melakukan sesuatu seperti

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

Ini berfungsi tetapi nilai yang saya dapatkan dikalikan faktor kepadatan layar (1,5 untuk hdpi, 2,0 untuk xhdpi, dll).

Saya juga coba lakukan

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

Ini akan bekerja pada prinsipnya tetapi saya mendapatkan string yang berakhiran "dip" ...

Héctor Júdez Sapena
sumber
1
Saya ingin tahu apakah ini bug di Android karena Resources memiliki metode getDimensionPixelSize(int id)yang secara tepat menyatakan bahwa ia kembali dalam Pixel, jadi getDimension(int id)harus kembali dalam dp (unit independen ketergantungan), yang siap digunakan, misalnya dengan ViewsetPadding
Paul Verest

Jawaban:

812

Di dimens.xml saya

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

Dalam kode Jika saya melakukannya

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

ini akan mengembalikan 72 yang sebagai status dokumen dikalikan dengan kepadatan telepon saat ini (48dp x 1,5 dalam kasus saya)

persis seperti yang dinyatakan dokumen:

Ambil dimensi untuk ID sumber daya tertentu. Konversi unit didasarkan pada DisplayMetrics saat ini yang terkait dengan sumber daya.

jadi jika Anda ingin nilai dp tepat seperti dalam xml cukup bagilah dengan kepadatan DisplayMetrics

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

dp akan menjadi 48 sekarang

AndroidGecko
sumber
3
Saya pikir dokumentasinya sangat tidak jelas di sini. "Konversi unit didasarkan pada DisplayMetrics saat ini yang terkait dengan sumber daya." ketika semua yang ingin mereka katakan adalah mereka mengonversi ke piksel.
Trilarion
Jika pada dasarnya Anda akan membuang pengali metrik tampilan, Anda juga bisa menentukan dimensi Anda dalam px. <dimen name = "test"> 48px </dimen>. getDimension (R.dimen.test) akan kembali 48.
Michael Peterson
Tidak berfungsi untuk saya: stackoverflow.com/questions/55972518/…
Alex
@Trilarion Mereka tidak hanya mengkonversi ke piksel. Mereka mengatakan bahwa dpakan memberikan nilai piksel skala relatif terhadap skala objek sumber daya yang digunakan untuk mengambilnya. Setelah Anda masuk ke berbagai cara untuk mendapatkan sumber daya, ini akan lebih relevan. Untuk kesederhanaan, Anda dapat menganggapnya sebagai relatif terhadap skala layar. Ada juga sp, atau piksel relatif terhadap ukuran teks sistem, dan px, atau piksel secara langsung. Masing-masing berbeda dan memiliki tujuan yang berbeda.
Abandoned Cart
20
Context.getResources().getDimension(int id);
Jug6ernaut
sumber
18

The Resourcekelas juga memiliki metode getDimensionPixelSize () yang saya pikir akan sesuai dengan kebutuhan Anda.

Ovidiu Latcu
sumber
24
Ini salah! konversi metrik juga terjadi getDimensionPixelSize()jika Anda dapat merujuk dokumen yang dengan jelas menyatakan Pengembalian Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammad Babar
Ini salah. Konversi metrik juga terjadi menggunakan metode ini.
Michael Peterson
14

Bagi mereka yang hanya perlu menyimpan beberapa intnilai dalam sumber daya, Anda dapat melakukan hal berikut.

integers.xml

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

Kode

int defaultValue = getResources().getInteger(R.integer.default_value);
Suragch
sumber
2
Terima kasih untuk ini, lebih dari apa yang saya cari walaupun mungkin bukan untuk orang lain, tetapi solusi yang diberikan ini benar-benar memberi saya wawasan tentang area lain dari kode saya
JamisonMan111
11

Anda dapat menggunakan getDimensionPixelOffset () alih-alih getDimension, jadi Anda tidak perlu melakukan cast ke int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
Jonny Right
sumber
2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Saya pikir itu baik untuk mendapatkan nilai sesuai resolusi tetapi jika Anda tidak ingin melakukan ini berikan ini di px .......

Pixel-independent pixel (dp)

Unit piksel virtual yang harus Anda gunakan saat mendefinisikan tata letak UI, untuk mengekspresikan dimensi atau posisi tata letak dengan cara yang tidak bergantung pada kepadatan. Pixel independen-kepadatan setara dengan satu pixel fisik pada layar 160 dpi, yang merupakan kepadatan awal yang diasumsikan oleh sistem untuk layar kepadatan "sedang". Saat runtime, sistem secara transparan menangani penskalaan unit dp apa pun, jika perlu, 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.Anda harus selalu menggunakan unit dp saat menentukan UI aplikasi Anda, untuk memastikan tampilan UI Anda yang benar di layar dengan kepadatan yang berbeda.

Saya pikir itu baik untuk mengubah nilai sesuai resolusi tetapi jika Anda tidak ingin melakukan ini berikan ini di px .......

lihat tautan ini

sesuai ini

dp

Pixel-Density-independent - Unit abstrak yang didasarkan pada kepadatan fisik layar. Unit-unit ini relatif terhadap layar 160 dpi (dots per inch), di mana 1dp kira-kira sama dengan 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.Rasio dp-ke-pixel akan berubah dengan kerapatan layar, tetapi tidak harus dalam proporsi langsung. Menggunakan unit dp (bukan unit px) adalah solusi sederhana untuk membuat ukuran tampilan di tata letak Anda diubah ukurannya dengan benar untuk kepadatan layar yang berbeda. Dengan kata lain, ini memberikan konsistensi untuk ukuran dunia nyata elemen UI Anda di berbagai perangkat.

px

Piksel - Sesuai dengan piksel aktual di layar. Unit pengukuran ini tidak direkomendasikan karena representasi aktual dapat bervariasi antar perangkat; setiap perangkat mungkin memiliki jumlah piksel yang berbeda per inci dan mungkin memiliki lebih banyak atau lebih sedikit total piksel yang tersedia di layar.

Dheeresh Singh
sumber
2

Gunakan Ekstensi Kotlin

Anda dapat menambahkan ekstensi untuk menyederhanakan proses ini. Ini memungkinkan Anda untuk hanya menelepon context.dp(R.dimen. tutorial_cross_marginTop)untuk mendapatkan nilai Float

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

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

Jika Anda ingin menanganinya tanpa konteks, Anda dapat menggunakan Resources.getSystem():

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

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

Misalnya, pada perangkat xhdpi, gunakan 24.dpuntuk mendapatkan 12.0 atau 12.pxuntuk mendapatkan 24

Gibolt
sumber