เพิ่มค่า floating point ให้กับทรัพยากร / ค่าของ 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 โปรดสังเกตว่าคุณสามารถใช้ตัวดัดแปลง "รูปแบบ" และ / หรือ "ตัวพิมพ์" อื่น ๆ ได้โดยที่รูปแบบนั้นหมายถึง:

Format = การปิดล้อมชนิดข้อมูล:

  • ลอย
  • บูล
  • เศษ
  • จำนวนเต็ม
  • ...

และประเภทย่อมาจาก:

Type = ประเภททรัพยากร (อ้างอิงกับ 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)) แต่ Android 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 "type # 0x04 ไม่ถูกต้อง" เมื่อดึงค่าจากรหัส
Moises Jimenez

คุณสามารถระบุปัญหาที่เฉพาะเจาะจงมากขึ้นได้ไหม? คุณอาจใช้รูปแบบข้อมูลที่ไม่ถูกต้องในการจัดรูปแบบ ...
Tomo

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>แท็กใช่ไหม
pablisco

4
ฉันคิดว่าคุณควรลบส่วนที่เป็นแฮ็คออกไปการแก้ปัญหานั้นสมบูรณ์แบบอย่างที่มันเป็น
Mathijs Segers

83

ตามที่อธิบายไว้ในลิงค์นี้http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.htmlลิงก์นี้

ประกาศเป็น dimen.xml

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

อ้างอิงจาก xml

@dimen/my_float_value

อ้างอิงจาก java

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 สำหรับ drawable คุณควรใช้ส่วนข้อมูล
waqaslam

มันไม่ทำงานเลย AndroidStudio ล้มเหลวแม้จะมีมิติ
Vyacheslav

ฉันหมายถึงการใช้<dimen>
waqaslam

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

คำเตือน : ใช้งานได้เมื่อคุณใช้ dimen จากโค้ด Java ไม่ใช่จาก xml


ถ้าฉันใช้ค่าดังกล่าวในนิยาม XML: android: lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER" มันทำให้ NumberFormatException ขณะขยายเค้าโครง
peter.bartos

4
เผง ใช้ได้เฉพาะเมื่อคุณใช้ dimen จากโค้ด Java
Cristian

2
นี่เป็นวิธีที่ดีที่สุดในการเข้าถึงการลอยจากโค้ด
Alex Lockwood

ใน floats.xml ฉันเพิ่ม <item name = "shadow_percent" type = "dimen"> 25% </item> จากนั้นใน drawable ของฉันฉันใช้เปอร์เซนต์นี้เพื่อตั้งค่าศูนย์ไล่ระดับเงาโดยใช้ android: centerY = "@ dimen / shadow_percent " สิ่งนี้ทำงานได้อย่างสมบูรณ์เพื่อกำหนดเงาเป็น 25% ของความสูงทั้งหมดของรายการเลเยอร์ ขอบคุณ!
Chris Sprague

เพียงโน้ตคุณควรใช้type="fraction"เพื่อหลีกเลี่ยงข้อผิดพลาดในโค้ด Java
adek111

8

เพิ่มการลอยเพื่อ dimens.xml:

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

ในการอ้างอิงจาก XML:

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

หากต้องการอ่านค่านี้โดยทางโปรแกรมคุณสามารถใช้ResourcesCompat.getFloatจาก androidx.core

Gradle พึ่งพา:

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

การใช้งาน:

import androidx.core.content.res.ResourcesCompat;

...

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

7

นอกจากนี้เรายังสามารถใช้เป็นแนวทางในการจัดวางข้อ จำกัด

สร้างไฟล์ integer.xml และเพิ่มเข้าไป

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

ใช้จากไฟล์ layout.xml

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
สิ่งที่ฉันต้องการฉันใช้นี้สำหรับค่าร้อยละที่แตกต่างกันสำหรับแท็บเล็ตและที่แตกต่างกันสำหรับโทรศัพท์มือถือโดยไม่ต้องสร้างสองไฟล์รูปแบบ
Abdu

5

ฉันใช้สไตล์เพื่อแก้ไขปัญหานี้ การเชื่อมโยงอย่างเป็นทางการที่นี่

สิ่งที่มีประโยชน์สวย คุณสร้างไฟล์เพื่อเก็บสไตล์ของคุณ (เช่น "styles.xml") และกำหนดภายในไฟล์ จากนั้นคุณอ้างอิงสไตล์ในเลย์เอาต์ของคุณ (เช่น "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."
/>

ลองทำดู - นี่เป็นสิ่งสำคัญที่ UI ในตัวทั้งหมดทำบน Android และด้วยการใช้สไตล์คุณจะมีตัวเลือกในการปรับเปลี่ยนมุมมองอื่น ๆ ทุกประเภทของ Views ของคุณเช่นกัน


2

หากคุณมีโฟลตแบบธรรมดาที่คุณสามารถควบคุมช่วงได้คุณสามารถมีจำนวนเต็มในทรัพยากรและหารด้วยจำนวนตำแหน่งทศนิยมที่คุณต้องการในโค้ด

ดังนั้นสิ่งนี้

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

จะใช้กับทศนิยม 2 ตำแหน่ง

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

และนั่นทำให้มันเป็น3.56f

ไม่ได้บอกว่านี่เป็นทางออกที่หรูหราที่สุด แต่สำหรับโครงการง่าย ๆ ก็สะดวก


0

ฉันพบวิธีแก้ปัญหาที่ใช้งานได้ แต่ส่งผลให้ a Warning( WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a}) ใน LogCat

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

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

ดูคำตอบของฉันข้างต้น คุณสามารถใช้รายการทรัพยากร "ทั่วไป" ซึ่งคุณควรระบุรูปแบบและประเภท รูปแบบสำหรับประเภท java (float, บูลีน, เศษส่วน, จำนวนเต็ม, ฯลฯ ) และประเภทนี้ใช้สำหรับการอ้างอิงทรัพยากร gen Android ("dimen" สำหรับ R.dimen "color" สำหรับ R.color "string" สำหรับ R.string ฯลฯ )
Tomo

นี่คือคำตอบเริ่มต้นของฉันซึ่งล้าสมัยไปแล้วในตอนนี้นั่นเป็นเหตุผลที่ฉันยอมรับคำตอบของคุณ :)
เลื่อน

0

แม้ว่าฉันเคยใช้คำตอบที่ยอมรับมาแล้ว แต่ดูเหมือนว่าเครื่องมือสร้างปัจจุบันเป็นไปได้ที่จะทำ:

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

ฉันใช้ Build Tools รุ่นหลัก 29

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.