অ্যান্ড্রয়েড সংস্থান / মানগুলিতে ভাসমান পয়েন্টের মান যুক্ত করুন


243

আমি ডকুমেন্টেশনandroid:lineSpacingMultiplier থেকে আমার টেক্সটভিউগুলিতে রেখার মাঝে সামান্য জায়গা যুক্ত করার চেষ্টা করছি :

গুণক হিসাবে পাঠ্য রেখার মধ্যে অতিরিক্ত ব্যবধান।

"1.2" এর মতো অবশ্যই একটি ভাসমান পয়েন্টের মান হতে হবে।

যেহেতু আমি এটি কয়েকটি ভিন্ন টেক্সটভিউগুলিতে ব্যবহার করছি আমি আমার সংস্থানগুলিতে একটি বৈশ্বিক মাত্রা / মান যুক্ত করতে চাই, তবে আমি জানি না যে কোন ট্যাগটি ব্যবহার করতে হবে তা যদি বিদ্যমান থাকে তবেও। আমি এমন সমস্ত রিসোর্স ধরণের চেষ্টা করেছি যা আমার কাছে বোধগম্য, কিন্তু সেগুলির কোনওটিই কাজ করে না।

আমি যা চাই তা এইরকম কিছু হতে পারে:

<resources>
    <dimen name="text_line_spacing">1.4</dimen>
</resources>

সম্পাদনা: আমি সচেতন android:lineSpacingExtra(যা একটি সংযুক্ত ইউনিটের সাথে একটি মাত্রা প্রয়োজন) তবে আমি android:lineSpacingMultiplierযদি সম্ভব হয় তবে তা ব্যবহার করতে চাই ।

উত্তর:


517

একটি সমাধান আছে:

<resources>
    <item name="text_line_spacing" format="float" type="dimen">1.0</item>
</resources>

এইভাবে, আপনার ভাসমান নম্বর @ মাত্রার অধীনে থাকবে। লক্ষ্য করুন যে আপনি অন্যান্য "ফর্ম্যাট" এবং / অথবা "টাইপ" সংশোধক ব্যবহার করতে পারেন, যেখানে ফর্ম্যাটটি দাঁড়িয়েছে:

ফর্ম্যাট = সংযুক্ত তথ্য প্রকার:

  • ভাসা
  • বুলিয়ান
  • ভগ্নাংশ
  • পূর্ণসংখ্যা
  • ...

এবং টাইপ এর জন্য দাঁড়িয়েছে:

প্রকার = সংস্থান প্রকার (আর। এক্সএক্সএক্সএক্সএক্সএক্স নামের সাথে রেফারেন্স করা):

  • রঙ
  • dimen
  • দড়ি
  • শৈলী
  • ইত্যাদি ...

কোড থেকে রিসোর্স আনতে আপনার এই স্নিপেটটি ব্যবহার করা উচিত:

TypedValue outValue = new TypedValue();
getResources().getValue(R.dimen.text_line_spacing, outValue, true);
float value = outValue.getFloat();  

আমি জানি যে এটি বিভ্রান্তিকর (আপনি কলটির মতো প্রত্যাশা করবেন getResources().getDimension(R.dimen.text_line_spacing)) তবে অ্যান্ড্রয়েডের dimensionsবিশেষ চিকিত্সা রয়েছে এবং খাঁটি "ফ্লোট" নম্বরটি বৈধ মাত্রা নয়।


তদ্ব্যতীত , ভাসমান সংখ্যাটি মাত্রাতে রাখার জন্য ছোট "হ্যাক" রয়েছে তবে সতর্ক থাকুন যে এটি সত্যই হ্যাক এবং আপনি ভাসমানের পরিসীমা এবং নির্ভুলতা হারাতে পারেন এমন ঝুঁকি নিয়ে যাচ্ছেন

<resources>
    <dimen name="text_line_spacing">2.025px</dimen>
</resources>

এবং কোড থেকে, আপনি যে ভাসা দ্বারা পেতে পারেন

float lineSpacing = getResources().getDimension(R.dimen.text_line_spacing);

এক্ষেত্রে মানটি lineSpacingহ'ল 2.024993896484375, এবং 2.025আপনার প্রত্যাশার মতো নয় ।


2
কোডটি থেকে মানটি পুনরুদ্ধার করার সময় আমি এটি ব্যবহার করার চেষ্টা করেছি তবে নটফাউন্ডএক্সসেপশন পেয়েছি, "টাইপ # 0x04 বৈধ নয়"।
মোয়েসেস জিমনেজ

আপনি কি সমস্যা সম্পর্কে আরও নির্দিষ্ট হতে পারেন? আপনি সম্ভবত ফর্ম্যাটের জন্য ভুল ডেটা টাইপ ব্যবহার করেছেন ...
টমো

19
@rodkarom এক্সএমএল থেকে ভাসমান পুনরুদ্ধার করতে, এই এক্সএমএল: <item type="string" format="float" name="my_float">0.5</item>এবং এই কোডটি এটি পুনরুদ্ধার করতে ব্যবহার করুন:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
গ্রেগন 3

1
@ গ্রেগন 3 কি কেবল <string>ট্যাগ দিয়েই করা যায় না ?
পাব্লিসকো

4
আমি মনে করি আপনার হ্যাকিশ অংশটি সরিয়ে নেওয়া উচিত, সমাধানটি ঠিক যেমন নিখুঁত।
ম্যাথিজস সেগারস

83

এই লিঙ্কটিতে বর্ণিত হিসাবে http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html

মাত্রা। XML এ ঘোষণা করুন

<item name="my_float_value" type="dimen" format="float">9.52</item>

এক্সএমএল থেকে রেফারেন্সিং

@dimen/my_float_value

জাভা থেকে রেফারেন্সিং

TypedValue typedValue = new TypedValue();
getResources().getValue(R.dimen.my_float_value, typedValue, true);
float myFloatValue = typedValue.getFloat();

43

সমস্ত সমাধান আপনাকে কোডের মাধ্যমে পূর্বনির্ধারিত ফ্লোট মানটি ব্যবহার করার পরামর্শ দেয়।

তবে আপনি যদি ভাবছেন যে কীভাবে এক্সএমএল (উদাহরণস্বরূপ লেআউটগুলি) -এর পূর্বনির্ধারিত ফ্লোট মানটি উল্লেখ করা যায় তবে নীচে আমি কী করেছি এবং এটি নিখুঁতভাবে কাজ করছে তার একটি উদাহরণ রয়েছে:

উত্সের মানগুলি type="integer"তবে হিসাবে সংজ্ঞায়িত করুন format="float":

<item name="windowWeightSum" type="integer" format="float">6.0</item>
<item name="windowNavPaneSum" type="integer" format="float">1.5</item>
<item name="windowContentPaneSum" type="integer" format="float">4.5</item>

এবং পরে এগুলি ব্যবহার করে আপনার বিন্যাসে ব্যবহার করুন @integer/name_of_resource, উদাহরণস্বরূপ:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="@integer/windowWeightSum"                 // float 6.0
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="@integer/windowNavPaneSum"        // float 1.5
        android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="@integer/windowContentPaneSum"    // float 4.5
        android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

</LinearLayout>

1
এটি সর্বোত্তম উত্তর কারণ এটি কোড না লিখে স্ক্রিন রোটেশনের উপর গতিশীল মাত্রা মানের পরিবর্তন করতে আমাকে সক্ষম করে।
ফিলিও 99

অঙ্কনযোগ্যদের জন্য ভাইচাস্লাভ, আপনার স্ট্যান্ডার্ড মাত্রা
ওয়াকসলাম

এটি মোটেই কাজ করে না। AndroidStudio এমনকি dimentions সঙ্গে ব্যর্থ
Vyacheslav

আমি বোঝাতে <dimen>
চাইছিলাম

19

আমি এমন একটি কাজও পেয়েছি যা মনে হয় কোনও সতর্কবার্তা না দিয়েই ঠিক কাজ করবে:

<resources>
    <item name="the_name" type="dimen">255%</item>
    <item name="another_name" type="dimen">15%</item>
</resources>

তারপর:

// theName = 2.55f
float theName = getResources().getFraction(R.dimen.the_name, 1, 1);
// anotherName = 0.15f
float anotherName = getResources().getFraction(R.dimen.another_name, 1, 1);

সতর্কতা : এটি তখনই কার্যকর হয় যখন আপনি জাভা কোড থেকে ডায়ালামটি এক্সএমএল থেকে ব্যবহার করেন না


এই দুর্ভাগ্যজনকভাবে কাজ করে না, যদি আমি এক্সএমএল সংজ্ঞায় এ জাতীয় মান ব্যবহার করি: অ্যান্ড্রয়েড: লাইনস্পিপিং মাল্টিপ্লায়ার = "@ মাত্রা / TEXT_SPACING_MULTIPLIER"। লেআউটটি স্ফীত করার সময় এটি সংখ্যার ফর্ম্যাটেক্সেক্সেশন ঘটায়।
পিটার.বার্তোস

4
যথাযথভাবে। আপনি যখন জাভা কোড থেকে মাত্রাটি ব্যবহার করেন এটি কেবল তখনই কাজ করে।
ক্রিশ্চিয়ান

2
কোড থেকে ভাসমান অ্যাক্সেস পেতে আমি এটিই সেরা উপায়।
অ্যালেক্স লকউড

Floats.xML এ আমি <আইটেমের নাম = "ছায়া_প্রসারণ" টাইপ = "মাত্রা"> 25% </item> এবং তারপরে আমার আঁকতে আমি এই শতাংশটি অ্যান্ড্রয়েড ব্যবহার করে ছায়া গ্রেডিয়েন্টের কেন্দ্র স্থাপন করতে এই শতাংশটি ব্যবহার করেছি: CenterY = "@ आयाম / ছায়া_পরিষদ "। স্তর-তালিকার মোট উচ্চতার 25% ছায়াকে সেট করতে এটি পুরোপুরি কাজ করেছিল। ধন্যবাদ!
ক্রিস স্প্রেগ

কেবল একটি নোট, type="fraction"জাভা কোডে ত্রুটিগুলি এড়াতে আপনার ব্যবহার করা উচিত
adek111

8

Dimens.xML এ একটি ফ্লোট যুক্ত করুন:

<item format="float" name="my_dimen" type="dimen">1.2</item>

এক্সএমএল থেকে রেফারেন্স:

<EditText 
    android:lineSpacingMultiplier="@dimen/my_dimen"
    ...

প্রোগ্রামটিমে এই মানটি পড়তে আপনি ResourcesCompat.getFloatandroidx.core থেকে ব্যবহার করতে পারেন

গ্রেডল নির্ভরতা:

implementation("androidx.core:core:${version}")

ব্যবহার:

import androidx.core.content.res.ResourcesCompat;

...

float value = ResourcesCompat.getFloat(context.getResources(), R.dimen.my_dimen);

7

আমরা এটিকে বাধা বিন্যাসের গাইডলাইনের জন্যও ব্যবহার করতে পারি।

পূর্ণসংখ্যা.এমএমএল ফাইল তৈরি করুন এবং এতে যুক্ত করুন

 <item name="guideline_button_top" type="integer" format="float">0.60</item>

একটি লেআউট.এক্সএমএল ফাইল থেকে ব্যবহার করুন

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
আমার যা প্রয়োজন তা ঠিক, আমি দুটি লেআউট ফাইল তৈরি না করে ট্যাবলেটগুলির জন্য বিভিন্ন শতাংশ এবং মোবাইলের জন্য পৃথক পৃথক মানের জন্য এটি ব্যবহার করি
আবদু

5

আমি এই সমস্যাটি সমাধান করার জন্য একটি স্টাইল ব্যবহার করেছি। অফিসিয়াল লিঙ্কটি এখানে

খুব দরকারী জিনিস। আপনি আপনার স্টাইলগুলি ধরে রাখার জন্য একটি ফাইল তৈরি করেন ("স্টাইলস.এক্সএমএল" এর মতো), এবং এটির ভিতরে এটি সংজ্ঞায়িত করুন। তারপরে আপনি আপনার বিন্যাসে শৈলীগুলি উল্লেখ করুন ("মেইন.এমএমএল" এর মতো)।

এখানে একটি নমুনা শৈলী যা আপনি যা চান তা করে:

<style name="text_line_spacing">
   <item name="android:lineSpacingMultiplier">1.4</item>
</style>

ধরা যাক আপনি এটির সাথে একটি সাধারণ টেক্সটভিউ পরিবর্তন করতে চান। আপনার লেআউট ফাইলটিতে আপনি টাইপ করতে পারেন:

<TextView
   style="@style/summary_text"
   ...
   android:text="This sentence has 1.4 times more spacing than normal."
/>

এটি ব্যবহার করে দেখুন - অ্যান্ড্রয়েডে সমস্ত বিল্ট-ইন ইউআই কীভাবে করা হয় তা মূলত এটি। শৈলীগুলি ব্যবহার করে, আপনার নিজের দর্শনগুলির অন্যান্য ধরণের দিকগুলিও সংশোধন করার বিকল্প রয়েছে।


2

আপনার যদি সীমাবদ্ধতা নিয়ন্ত্রণ করে এমন সাধারণ ভাসমানগুলি থাকে তবে আপনার সংস্থানগুলিতে একটি পূর্ণসংখ্যাও থাকতে পারে এবং কোডে সরাসরি যে দশমিক জায়গাগুলি প্রয়োজন তার সংখ্যা দ্বারা ভাগ করে নিতে পারেন।

এরকম কিছু

<integer name="strokeWidth">356</integer>

2 দশমিক স্থান সহ ব্যবহৃত হয়

this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);    
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);

এবং এটি এটিকে 3.56f করে তোলে

এটি সর্বাধিক মার্জিত সমাধান না বলা সহজ সরল প্রকল্পগুলির জন্য এটি সুবিধাজনক।


0

আমি একটি সমাধান পেয়েছি, যা কাজ করে তবে লগগেটে Warning( WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a}) ফলাফল দেয়।

<resources>
    <string name="text_line_spacing">1.2</string>
</resources>

<android:lineSpacingMultiplier="@string/text_line_spacing"/>

আমার উত্তর উপরে দেখুন। আপনি "জেনেরিক" রিসোর্স আইটেমটি ব্যবহার করতে পারেন, যেখানে আপনার ফর্ম্যাট এবং টাইপ নির্দিষ্ট করা উচিত। ফর্ম্যাটটি জাভা টাইপের (ফ্লোট, বুলিয়ান, ভগ্নাংশ, পূর্ণসংখ্যার ইত্যাদি) জন্য, এবং প্রকারটি অ্যান্ড্রয়েড জিন রিসোর্স রেফারেন্সের জন্য (আর ডিডিমেনের জন্য "মাত্রা", আর কোডোরার জন্য "রঙ", আর স্ট্রিংয়ের জন্য "স্ট্রিং" রয়েছে) , ইত্যাদি)
টমো

এটি আমার প্রাথমিক উত্তর যা এখন সত্যিই পুরানো, তাই আমি আপনার উত্তরটি গ্রহণ করেছি। :)
স্লিপ

0

যদিও আমি ইতিপূর্বে গৃহীত উত্তরটি ব্যবহার করেছি, তবে বর্তমান বিল্ড সরঞ্জামগুলির সাথে মনে হয় এটি করা সম্ভব:

   <dimen name="listAvatarWidthPercent">0.19</dimen>

আমি বিল্ড সরঞ্জামগুলির প্রধান সংস্করণ 29 ব্যবহার করছি।

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