รับมิติจาก XML และกำหนดขนาดตัวอักษรในรันไทม์


101

ใน dimens.xml ฉันมี:

<dimen name="text_medium">18sp</dimen>

ในรันไทม์ฉันได้รับค่านี้และกำหนดขนาดตัวอักษรของมุมมองข้อความ:

int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);
textView.setTextSize(size).

บนแท็บเล็ต 10″ (1280 x 800) ทุกอย่างเรียบร้อย แต่ในโทรศัพท์ (800 x 480) มุมมองข้อความมีแบบอักษรขนาดใหญ่มาก บนแท็บเล็ตขนาดเท่ากับ 18 ในโทรศัพท์มันคือ 27

หากฉันกำหนดขนาดด้วยตนเองโดย:

textView.setTextSize(size)

ขนาดปกติบนอุปกรณ์ทั้งสอง

คำตอบ:


297
<dimen name="text_medium">18sp</dimen>

กำหนดขนาดในรหัส:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));

7
ฉันไม่รู้เกี่ยวกับ OP แต่นี่คือคำตอบที่ฉันกำลังมองหา ฉันใช้ COMPLEX_UNIT_DP โดยคิดว่าฉันจำเป็นต้องระบุประเภทอินพุตไม่ใช่ประเภทเอาต์พุต
HenryAdamsJr

เมื่อฉันได้ขนาดตัวอักษรของฉัน (กำหนดเป็น sp) ฉันจะได้ 60 เมื่อฉันตั้งค่ากลับด้วย OMPLEX_UNIT_PX และดึงกลับมาอีกครั้งฉันได้ 70 ดูเหมือนว่าทุกอย่างจะไม่ชัดเจนที่นี่
Gleichmut

2
สำหรับขนาดข้อความเหตุใดฉันจึงใช้TypedValue.COMPLEX_UNIT_SPแทนไม่ได้
dphans

3
@dphans Resources.getDimension()วิธีการคืนค่าที่คูณด้วยเมตริกที่เหมาะสมแล้ว
pkuszewski

2
@pkuszewski ว้าวสับสนจัง
Big_Chair

4

ทั้งสองวิธี getDimensionPixelSize () และ getDimension () ใช้ความหนาแน่นของหน้าจอเพื่อคำนวณพิกเซล ความหนาแน่นของหน้าจอโทรศัพท์ของคุณเห็นได้ชัดว่าเป็น hdpi (240dpi) ดังนั้นจึงใช้ 1.5 สเกลในการแปลง dp เป็น sp คณิตศาสตร์ง่ายๆ 18 * 1.5 = 27

ดูเหมือนว่าความหนาแน่นของแท็บเล็ตคือ mdpi (160dpi) ดังนั้นสเกลจึงเป็นเพียง 1: 1

แต่ถ้าเทียบขนาดจริงของทั้งสองข้อความน่าจะเท่ากัน

วิธีที่ดีที่สุดคือสร้างไฟล์ dimens.xml สองไฟล์หนึ่งไฟล์ในโฟลเดอร์ values ​​สำหรับโทรศัพท์และอีกไฟล์ใน values-sw600dp สำหรับแท็บเล็ต (คุณสามารถใช้โฟลเดอร์ values-sw720dp-land เพื่อจัดเก็บขนาดสำหรับแท็บเล็ตขนาด 10 นิ้วในแนวนอนได้)

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมิติข้อมูลใน Android ได้ที่: http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/


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