উত্স কোড থেকে res / মান / মাত্রা.xml থেকে মাত্রা মান লোড করুন


337

আমি মানটি যেমন লোড করতে চাই আমার দুটি dimension.xmlফাইল রয়েছে, একটিতে /res/values/dimension.xmlএবং অপরটি একটি /res/values-sw360dp/dimension.xml

উত্স কোড থেকে আমি এর মতো কিছু করতে চাই

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

এটি কাজ করে তবে আমার প্রাপ্ত মানটি স্ক্রিনের ঘনত্বের গুণক (এইচডিপিআইয়ের জন্য 1.5, এক্সএইচডিপিআই এর জন্য 2.0) ইত্যাদির বহুগুণ হয়।

আমিও চেষ্টা করেছি

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

এটি নীতিগতভাবে কাজ করবে তবে আমি একটি স্ট্রিং পেয়ে যা "ডিপ" এ শেষ হবে ...


1
আমি আশ্চর্য হয়েছি যে এটি অ্যান্ড্রয়েডে বাগ হিসাবে রয়েছে কারণ সম্পদের এমন পদ্ধতি রয়েছে getDimensionPixelSize(int id)যা ঠিক বলেছে যে এটি getDimension(int id)setPadding
পিক্সলে

উত্তর:


811

আমার dimens.xML এ আছে

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

কোড আমি যদি না

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

এটি return২ এ ফিরে আসবে যা ডকুমেন্ট হিসাবে বর্তমান ফোনের ঘনত্ব দ্বারা গুণিত হয় (আমার ক্ষেত্রে 48 ডিপি x 1.5)

দস্তাবেজ রাষ্ট্র হিসাবে ঠিক:

নির্দিষ্ট সংস্থান আইডির জন্য একটি মাত্রিক পুনরুদ্ধার করুন। ইউনিট রূপান্তরগুলি রিসোর্সের সাথে যুক্ত বর্তমান ডিসপ্লেমেট্রিক্সের উপর ভিত্তি করে।

সুতরাং আপনি যদি এক্সএমএল ঠিক ঠিক ডিপি মান চান তবে এটি কেবল ডিসপ্লেমেট্রিক্সের ঘনত্বের সাথে ভাগ করুন

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

ডিপি এখন 48 হবে


3
আমি মনে করি ডকুমেন্টেশন এখানে বিশেষভাবে অস্পষ্ট। "ইউনিট রূপান্তরগুলি সম্পদের সাথে জড়িত বর্তমান ডিসপ্লেমেট্রিক্সের ভিত্তিতে" " যখন তারা কেবল বলতে চান তারা পিক্সেলগুলিতে রূপান্তর করে।
ট্র্যারিরিওন

আপনি যদি মূলত ডিসপ্লে মেট্রিক্সের গুণককে ছাড়িয়ে যাচ্ছেন তবে আপনি কেবলমাত্র পিক্সে আপনার মাত্রাটি সংজ্ঞায়িত করতে পারেন। <মাত্রা নাম = "পরীক্ষা"> 48px </dime>। getDimesion (R.dimen.test) 48 ফিরে আসবে
মাইকেল পিটারসন

আমার জন্য কাজ করছেন না: stackoverflow.com/questions/55972518/…
অ্যালেক্স

@ ট্রিলারিয়ন যদিও তারা কেবল পিক্সেল রূপান্তর করে না। তারা বলছে যে dpএটি পুনরুদ্ধার করতে ব্যবহৃত রিসোর্স অবজেক্টের স্কেলের সাথে সম্পর্কিত আকারযুক্ত পিক্সেল মান দেবে value আপনি একবার সম্পদ প্রাপ্ত করার জন্য বিভিন্ন উপায়ে প্রবেশ করলে এটি আরও প্রাসঙ্গিক হবে। সরলতার জন্য, আপনি এটিকে স্ক্রিন স্কেলের সাথে সম্পর্কিত বলে ভাবতে পারেন। রয়েছে 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
এর জন্য আপনাকে ধন্যবাদ, আমি যা খুঁজছিলাম তার চেয়ে অনেক বেশি যদিও অন্যদের জন্য নয়, তবে এই সমাধানটি আমাকে আমার কোডের অন্যান্য ক্ষেত্রগুলিতে কিছুটা অন্তর্দৃষ্টি দিয়েছিল
জ্যামিসনম্যান 111

11

আপনি getDimesion এর পরিবর্তে getDimesionPixelOffset () ব্যবহার করতে পারেন , সুতরাং আপনাকে কোনরকম করতে হবে না।

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 এ দিন .......

ঘনত্ব-স্বাধীন পিক্সেল (ডিপি)

ঘনত্ব-স্বাধীন উপায়ে লেআউটটির মাত্রা বা অবস্থান প্রকাশ করার জন্য ইউআই লেআউট সংজ্ঞায়িত করার সময় আপনার ব্যবহার করা উচিত এমন একটি ভার্চুয়াল পিক্সেল ইউনিট। ঘনত্ব-স্বাধীন পিক্সেল 160 ডিপিআই স্ক্রিনের একটি দৈহিক পিক্সেলের সমতুল্য, এটি একটি "মাঝারি" ঘনত্বের পর্দার জন্য সিস্টেম দ্বারা গৃহীত বেসলাইন ঘনত্ব। রানটাইমের সময়, সিস্টেমটি ডিপি ইউনিটগুলির যে কোনও স্কেলিং স্বচ্ছভাবে পরিচালনা করে, প্রয়োজনীয় হিসাবে, 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.আপনার ঘনত্বের বিভিন্ন ঘনত্ব সহ পর্দায় আপনার ইউআইয়ের যথাযথ প্রদর্শন নিশ্চিত করার জন্য আপনার অ্যাপ্লিকেশনটির ইউআই সংজ্ঞা দেওয়ার সময় আপনার সর্বদা ডিপি ইউনিট ব্যবহার করা উচিত।

আমি মনে করি রেজোলিউশন অনুসারে মান পরিবর্তন করা ভাল তবে আপনি যদি এটি করতে না চান তবে এইটিকে 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.ডিপি-টু-পিক্সেলের অনুপাত পর্দার ঘনত্বের সাথে পরিবর্তিত হবে, তবে সরাসরি অনুপাতের ক্ষেত্রে অগত্যা। বিভিন্ন পর্দার ঘনত্বের জন্য আপনার লেআউটে ভিউ ডাইমেনশনগুলি সঠিকভাবে আকার পরিবর্তন করার জন্য ডিপি ইউনিটগুলি (পিএক্স ইউনিটের পরিবর্তে) ব্যবহার করা একটি সহজ সমাধান। অন্য কথায়, এটি বিভিন্ন ডিভাইস জুড়ে আপনার ইউআই উপাদানগুলির আসল-বিশ্বের আকারের জন্য ধারাবাহিকতা সরবরাহ করে।

px আকারে

পিক্সেল - স্ক্রিনে প্রকৃত পিক্সেলের সাথে সম্পর্কিত। পরিমাপের এই ইউনিটটি প্রস্তাবিত নয় কারণ আসল উপস্থাপনা ডিভাইসগুলিতে পৃথক হতে পারে; প্রতিটি ডিভাইসে ইঞ্চি প্রতি পৃথক সংখ্যক পিক্সেল থাকতে পারে এবং স্ক্রিনে আরও কম সংখ্যক মোট পিক্সেল থাকতে পারে।


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

উদাহরণস্বরূপ, এক্সএইচডিপি ডিভাইসে, 24.dp12.0 পেতে বা 12.px24 পেতে ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.