Android संसाधनों / मूल्यों के लिए अस्थायी बिंदु मान जोड़ें


243

मैं का उपयोग कर मेरी TextViews लिए लाइनों के बीच एक छोटे से अंतरिक्ष में जोड़ने के लिए कोशिश कर रहा हूँ android:lineSpacingMultiplier से प्रलेखन :

एक गुणक के रूप में, पाठ की पंक्तियों के बीच अतिरिक्त अंतर।

एक अस्थायी बिंदु मान होना चाहिए, जैसे "1.2"।

जैसा कि मैं कुछ अलग-अलग TextViews में इसका उपयोग कर रहा हूं, मैं अपने संसाधनों में एक वैश्विक आयाम / मूल्य जोड़ना चाहूंगा, लेकिन मुझे नहीं पता कि किस टैग का उपयोग करना है, अगर यह मौजूद है। मैंने सभी संसाधन प्रकारों की कोशिश की है जो मुझे समझ में आते हैं, लेकिन उनमें से कोई भी काम नहीं करता है।

मैं ऐसा कुछ करना चाहूंगा:

<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 के अंतर्गत होगा। ध्यान दें कि आप अन्य "प्रारूप" और / या "प्रकार" संशोधक का उपयोग कर सकते हैं, जहां प्रारूप के लिए खड़ा है:

स्वरूप = डेटा प्रकार संलग्न करना:

  • नाव
  • बूलियन
  • अंश
  • पूर्णांक
  • ...

और प्रकार के लिए खड़ा है:

प्रकार = संसाधन प्रकार (R.XXXXX.name के साथ संदर्भित):

  • रंग
  • 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
मैंने इसका उपयोग करने की कोशिश की, लेकिन कोड से मान प्राप्त करते समय NotFoundException, "टाइप # 0x04 मान्य नहीं है" प्राप्त करें।
मोएजेस जिमेन्ज़

क्या आप समस्या के बारे में अधिक विशिष्ट हो सकते हैं? आपने संभवतः प्रारूप के लिए गलत डेटा प्रकार का उपयोग किया है ...
टॉम

19
@rodkarom को xml से फ़्लोट प्राप्त करने के लिए, इस XML का उपयोग करें: <item type="string" format="float" name="my_float">0.5</item>और इसे पुनः प्राप्त करने के लिए यह कोड:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
gregn3

1
@ gregn3 <string>टैग के साथ नहीं किया जा सकता है ?
11

4
मुझे लगता है कि आपको हैकिश वाले हिस्से को हटा देना चाहिए, जैसा कि है ठीक है।
मैथिज्स सीजर

83

जैसा कि इस लिंक http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html में वर्णित है

डिमन में घोषणा करें

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

Xml से संदर्भित

@dimen/my_float_value

जावा से संदर्भित

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

43

सभी समाधान आपको कोड के माध्यम से पूर्वनिर्धारित फ्लोट मान का उपयोग करने का सुझाव देते हैं।

लेकिन अगर आप सोच रहे हैं कि XML में पूर्वनिर्धारित फ्लोट मान (उदाहरण के लिए लेआउट) का संदर्भ कैसे दिया जाए, तो मैंने जो किया उसका एक उदाहरण निम्नलिखित है और यह पूरी तरह से काम कर रहा है:

के रूप में संसाधन मूल्यों को परिभाषित करें 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
यह सबसे अच्छा जवाब है क्योंकि यह मुझे कोड लिखने के बिना स्क्रीन रोटेशन पर गतिशील रूप से आयाम मूल्यों को बदलने में सक्षम बनाता है।
Phileo99

@Vyacheslav for drawables, आपको मानक आयामों का
वकासलम

यह बिल्कुल काम नहीं करता है। AndroidStudio भी आयाम के साथ विफल
व्याचेस्लाव

मेरा मतलब था<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);

चेतावनी : यह केवल तभी काम करता है जब आप जावा कोड से डिमेन का उपयोग करते हैं xml से नहीं


यह दुर्भाग्यपूर्ण काम नहीं करता है, अगर मैं XML परिभाषा में ऐसे मान का उपयोग करता हूं: android: lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER"। यह लेआउट फुलाते समय नंबरफ़ॉर्मटैसेप्शन का कारण बनता है।
पीटर.बार्टोस

4
बिल्कुल सही। यह केवल तभी काम करता है जब आप जावा कोड से डिमेन का उपयोग करते हैं।
क्रिस्टियन

2
यह सबसे अच्छा तरीका है जिससे मैं कोड से फ़्लोट्स तक पहुंच सकता हूं।
एलेक्स लॉकवुड

Floats.xml में मैंने <item name = "shadow_percent" टाइप = "dimen"> 25% </ item> जोड़ा और फिर अपने ड्रॉबल में मैंने इस प्रतिशत का उपयोग करके android: centerY = "dimen / shadow_percent का उपयोग करके छाया ढाल का केंद्र सेट किया। "। इसने लेयर-लिस्ट की कुल ऊंचाई के 25% पर छाया को सेट करने के लिए पूरी तरह से काम किया। धन्यवाद!
क्रिस स्प्रैग

सिर्फ एक नोट, आपको type="fraction"जावा कोड की त्रुटियों से बचने के लिए उपयोग करना चाहिए
adek111

8

Dimens.xml में एक फ्लोट जोड़ें:

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

XML से संदर्भ के लिए:

<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

हम इसका उपयोग बाधा के दिशानिर्देश के लिए भी कर सकते हैं।

पूर्णांक। Xml फ़ाइल बनाएँ और जोड़ें

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

एक लेआउट से उपयोग करें। xml फ़ाइल

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
वास्तव में मुझे क्या चाहिए, मैं इसे दो लेआउट फ़ाइलों को बनाने के बिना टेबलेट के लिए अलग-अलग प्रतिशत मूल्यों और मोबाइल के लिए अलग-अलग उपयोग कर रहा हूं
abdu

5

मैंने इस मुद्दे को हल करने के लिए एक शैली का उपयोग किया। आधिकारिक लिंक यहाँ है

बहुत उपयोगी सामान। आप अपनी शैलियों (जैसे "स्टाइल.एक्सएमएल") को रखने के लिए एक फ़ाइल बनाते हैं, और उन्हें इसके अंदर परिभाषित करते हैं। फिर आप अपने लेआउट में शैलियों को देखें (जैसे "main.xml")।

यहाँ एक नमूना शैली है जो आप चाहते हैं:

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

मान लें कि आप इसके साथ एक साधारण TextView बदलना चाहते हैं। अपनी लेआउट फ़ाइल में आप टाइप करेंगे:

<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"/>

मेरा जवाब ऊपर देखिए। आप "जेनेरिक" संसाधन आइटम का उपयोग कर सकते हैं, जहां आपको प्रारूप और प्रकार निर्दिष्ट करना चाहिए। प्रारूप जावा प्रकार (फ्लोट, बूलियन, अंश, पूर्णांक, आदि) के लिए है, और प्रकार Android जीन संसाधन संदर्भ के लिए है (R.dimen के लिए "dimen", R.color के लिए "रंग", R.string के लिए "स्ट्रिंग")। , आदि)
टॉमो

यह मेरा प्रारंभिक उत्तर था जो अब वास्तव में पुराना है, इसीलिए मैंने आपका उत्तर स्वीकार कर लिया है। :)
Slup

0

हालाँकि मैंने पूर्व में स्वीकृत उत्तर का उपयोग किया है, ऐसा लगता है कि वर्तमान बिल्ड टूल्स के साथ ऐसा करना संभव है:

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

मैं बिल्ड टूल प्रमुख संस्करण 29 का उपयोग कर रहा हूं।

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