स्रोत कोड से Res / मान / आयाम.xml से लोड आयाम मान


337

मैं मान को लोड करना चाहूंगा जैसे वह है। मेरे पास दो dimension.xmlफाइलें हैं, एक में /res/values/dimension.xmlऔर दूसरी में/res/values-sw360dp/dimension.xml

स्रोत कोड से मैं ऐसा कुछ करना चाहूंगा

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

यह काम करता है लेकिन मुझे जो मूल्य मिलता है वह स्क्रीन घनत्व कारक (एचडीपीआई के लिए 1.5, xhdpi के लिए 2.0, आदि) से गुणा होता है।

मैंने भी करने की कोशिश की

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

यह सिद्धांत रूप में काम करेगा लेकिन मुझे एक स्ट्रिंग मिलती है जो "डुबकी" में समाप्त होती है ...


1
मुझे आश्चर्य है कि अगर यह एंड्रॉइड में बग है, तो संसाधन में वह विधि है getDimensionPixelSize(int id)जो वास्तव में पिक्सेल में वापस आती है, इसलिए getDimension(int id)dp (निर्भरता स्वतंत्र इकाइयां) में लौटना चाहिए, जो उपयोग के लिए तैयार होगा, उदाहरण के लिए देखेंsetPadding
पॉल वेरस्ट

जवाबों:


811

मेरे डिमेंस में। xml मेरे पास है

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

कोड में अगर मैं करता हूँ

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

यह 72 होगा जो डॉक्स स्थिति को वर्तमान फोन के घनत्व से गुणा किया जाता है (मेरे मामले में 48dp x 1.5)

डॉक्स स्थिति के समान:

किसी विशेष संसाधन ID के लिए एक आयामी प्राप्त करें। इकाई रूपांतरण संसाधनों से जुड़े वर्तमान डिस्प्लेमेट्रिक्स पर आधारित हैं।

इसलिए यदि आप एक्सपीएल में ठीक डीपी मान चाहते हैं तो इसे डिस्प्लेमेटिक्स घनत्व के साथ विभाजित करें

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

dp अब 48 होगा


3
मुझे लगता है कि प्रलेखन यहाँ विशेष रूप से अस्पष्ट है। "यूनिट रूपांतरण संसाधनों से जुड़े वर्तमान डिस्प्लेमेट्रिक्स पर आधारित हैं।" जब वे सब कहना चाहते हैं कि वे पिक्सेल में बदल जाते हैं।
१२:१५ बजे त्रिशूल

यदि आप अनिवार्य रूप से प्रदर्शन मैट्रिक्स गुणक को त्यागने जा रहे हैं, तो आप अपने आयाम को px में परिभाषित कर सकते हैं। <dimen name = "test"> 48px </ dimen>। getDimension (R.dimen.test) 48 को लौटेगा।
माइकल पीटरसन

मेरे लिए काम नहीं: stackoverflow.com/questions/55972518/…
एलेक्स

@ ट्रिलियनियन वे केवल पिक्सेल में परिवर्तित नहीं होते हैं, हालांकि। वे कह रहे हैं कि dpस्केल किए गए पिक्सेल मूल्य को पुनः प्राप्त करने के लिए उपयोग किए गए संसाधन ऑब्जेक्ट के पैमाने के सापेक्ष देगा। एक बार जब आप संसाधनों को प्राप्त करने के विभिन्न तरीकों से जुड़ जाते हैं, तो यह अधिक प्रासंगिक होगा। सादगी के लिए, आप इसे स्क्रीन स्केल के सापेक्ष होने के रूप में सोच सकते हैं। वहाँ भी है sp, या सिस्टम पाठ आकार के सापेक्ष पिक्सेल, और px, या पिक्सेल सीधे। प्रत्येक अलग है और एक अलग उद्देश्य है।
कार्ट


17

Resourceवर्ग भी एक विधि है getDimensionPixelSize () जो मुझे लगता है कि अपनी आवश्यकताओं फिट होगा।


24
ये गलत है! मैट्रिक्स रूपांतरण भी करता है तब होता है में getDimensionPixelSize()यह स्पष्ट रूप से कहा गया है कि आप दस्तावेज़ों उल्लेख कर सकते हैं, तो रिटर्न Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
मुहम्मद बाबर

ये गलत है। मैट्रिक्स रूपांतरण इस पद्धति का उपयोग करने के साथ-साथ होता है।
माइकल पीटरसन

14

उन लोगों के लिए जिन्हें केवल intसंसाधनों में कुछ मूल्य बचाने की आवश्यकता है , आप निम्न कार्य कर सकते हैं।

integers.xml

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

कोड

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

2
इसके लिए धन्यवाद, जो कुछ भी मैं दूसरों के लिए नहीं था, उसके लिए मैं और अधिक देख रहा था, लेकिन इस समाधान ने मुझे वास्तव में मेरे कोड के अन्य क्षेत्रों में कुछ अंतर्दृष्टि प्रदान की
JamisonMan111

11

आप getDimension के बजाय getDimensionPixelOffset () का उपयोग कर सकते हैं , इसलिए आपको इंट करने की आवश्यकता नहीं है।

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).

मुझे लगता है कि संकल्प के अनुसार मूल्य प्राप्त करना अच्छा है लेकिन यदि आप ऐसा नहीं करना चाहते हैं तो इसे px में दें ......।

घनत्व-स्वतंत्र पिक्सेल (dp)

एक आभासी पिक्सेल इकाई जिसे आपको यूआई लेआउट को परिभाषित करते समय उपयोग करना चाहिए, लेआउट आयामों या स्थिति को घनत्व-स्वतंत्र तरीके से व्यक्त करने के लिए। घनत्व-स्वतंत्र पिक्सेल 160 डीपीआई स्क्रीन पर एक भौतिक पिक्सेल के बराबर है, जो कि एक "मध्यम" घनत्व स्क्रीन के लिए सिस्टम द्वारा ग्रहण की गई बेसलाइन घनत्व है। रनटाइम के दौरान, सिस्टम पारदर्शी रूप से dp इकाइयों के किसी भी स्केलिंग को संभालता है, जैसा कि आवश्यक है,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. आपको अपने एप्लिकेशन के UI को परिभाषित करते समय, विभिन्न घनत्वों के साथ स्क्रीन पर अपने UI के उचित प्रदर्शन को सुनिश्चित करने के लिए हमेशा dp इकाइयों का उपयोग करना चाहिए।

मुझे लगता है कि मूल्य को संकल्प के अनुसार बदलना अच्छा है लेकिन यदि आप ऐसा नहीं करना चाहते हैं तो इसे px में दें ......।

इस लिंक को देखें

इसके अनुसार

डी पी

घनत्व-स्वतंत्र पिक्सेल - एक अमूर्त इकाई जो स्क्रीन के भौतिक घनत्व पर आधारित होती है। ये इकाइयां एक 160 डीपीआई (डॉट्स प्रति इंच) स्क्रीन के सापेक्ष हैं, जिस पर 1dp लगभग 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.डीपी-टू-पिक्सेल का अनुपात स्क्रीन घनत्व के साथ बदल जाएगा, लेकिन जरूरी नहीं कि प्रत्यक्ष अनुपात में। डीपी इकाइयों (पीएक्स इकाइयों के बजाय) का उपयोग करना आपके लेआउट में दृश्य आयामों को विभिन्न स्क्रीन घनत्वों के लिए ठीक से आकार देने के लिए एक सरल समाधान है। दूसरे शब्दों में, यह विभिन्न उपकरणों में आपके UI तत्वों के वास्तविक-विश्व आकार के लिए स्थिरता प्रदान करता है।

पिक्सल

पिक्सेल - स्क्रीन पर वास्तविक पिक्सेल के अनुरूप है। माप की इस इकाई की अनुशंसा नहीं की जाती है क्योंकि वास्तविक प्रतिनिधित्व उपकरणों में भिन्न हो सकता है; प्रत्येक डिवाइस में प्रति इंच पिक्सेल की एक अलग संख्या हो सकती है और स्क्रीन पर अधिक या कम कुल पिक्सेल उपलब्ध हो सकते हैं।


2

कोटलिन एक्सटेंशन का उपयोग करें

आप इस प्रक्रिया को सरल बनाने के लिए एक एक्सटेंशन जोड़ सकते हैं। यह आपको context.dp(R.dimen. tutorial_cross_marginTop)फ्लोट मान प्राप्त करने के लिए कॉल करने में सक्षम बनाता है

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

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

यदि आप इसे संदर्भ के बिना संभालना चाहते हैं, तो आप उपयोग कर सकते हैं Resources.getSystem():

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

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

उदाहरण के लिए, xhdpi डिवाइस पर, 24.dp12.0 प्राप्त करने के लिए या 12.px24 प्राप्त करने के लिए उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.