ฉันต้องการระบุขนาดข้อความของตัวเองในแอปพลิเคชันของฉัน แต่ฉันมีปัญหาในการทำเช่นนี้
เมื่อฉันเปลี่ยนขนาดตัวอักษรในการตั้งค่าอุปกรณ์ขนาดตัวอักษรของแอปพลิเคชันของฉันTextView
ก็เปลี่ยนไปเช่นกัน
ฉันต้องการระบุขนาดข้อความของตัวเองในแอปพลิเคชันของฉัน แต่ฉันมีปัญหาในการทำเช่นนี้
เมื่อฉันเปลี่ยนขนาดตัวอักษรในการตั้งค่าอุปกรณ์ขนาดตัวอักษรของแอปพลิเคชันของฉันTextView
ก็เปลี่ยนไปเช่นกัน
คำตอบ:
sp
ที่จริงแล้วการตั้งค่าขนาดตัวอักษรมีผลกระทบเฉพาะในขนาด ดังนั้นสิ่งที่คุณต้องทำ - กำหนดtextSize
ในdp
แทนsp
แล้วการตั้งค่าจะไม่เปลี่ยนขนาดของข้อความใน app ของคุณ
นี่คือลิงค์ไปยังเอกสาร: ส่วนข้อมูล
อย่างไรก็ตามโปรดทราบว่าพฤติกรรมที่คาดหวังก็คือแบบอักษรในแอพทั้งหมดนั้นเคารพการตั้งค่าของผู้ใช้ มีสาเหตุหลายประการที่ผู้ใช้อาจต้องการปรับขนาดแบบอักษรและบางส่วนอาจเป็นทางการแพทย์ - ผู้ใช้ที่มีความบกพร่องทางสายตา การใช้ข้อความdp
แทนsp
อาจนำไปสู่การเลือกปฏิบัติอย่างไม่เต็มใจต่อผู้ใช้แอปบางส่วนของคุณ
เช่น:
android:textSize="32dp"
sp
dp
ผมได้รับการตอบสนองที่ดีจริงๆที่นี่: stackoverflow.com/questions/11638691/...
วิธีที่ง่ายที่สุดคือใช้สิ่งต่อไปนี้:
android:textSize="32sp"
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับtextSize
คุณสมบัติคุณสามารถตรวจสอบเอกสารของนักพัฒนาซอฟต์แวร์ Android
ใช้dimension
ประเภทของทรัพยากรเช่นเดียวกับที่คุณใช้string
ทรัพยากร ( DOCS )
ในdimens.xml
ไฟล์ของคุณให้ประกาศตัวแปรมิติของคุณ:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_height">25dp</dimen>
<dimen name="textview_width">150dp</dimen>
<dimen name="ball_radius">30dp</dimen>
<dimen name="font_size">16sp</dimen>
</resources>
จากนั้นคุณสามารถใช้ค่าเหล่านี้ดังนี้:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
คุณสามารถประกาศที่แตกต่างกัน dimens.xml
ไฟล์ที่แตกต่างกันสำหรับหน้าจอประเภทต่างๆ การทำเช่นนี้จะรับประกันลักษณะที่ต้องการของแอปของคุณบนอุปกรณ์ที่แตกต่างกัน
เมื่อคุณไม่ได้ระบุandroid:textSize
ระบบจะใช้ค่าเริ่มต้น
โปรดทราบว่าหากตั้งค่า textSize ไว้ในรหัสการโทรจะtextView.setTextSize(X)
ตีความหมายเลข (X) เป็น SP ใช้setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
ให้เป็นค่าที่ตั้งอยู่ในDP
ไม่ใช่เรื่องดีที่จะต้องระบุ DIP หรือ SP อีกครั้งด้วยรหัสเมื่อกำหนดไว้แล้วในไฟล์ dimen.xml
ฉันคิดว่าตัวเลือกที่ดีที่สุดคือการใช้ PX เมื่อใช้ค่า dimen.xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
ด้วยวิธีนี้คุณสามารถเปลี่ยนจาก DP เป็น SP ได้หากต้องการในไฟล์ dimen.xml โดยไม่ต้องเปลี่ยนรหัสใด ๆ
วิธีง่ายๆในการป้องกันไม่ให้แอปทั้งหมดได้รับผลกระทบจากขนาดแบบอักษรของระบบคือการอัปเดตการกำหนดค่าโดยใช้กิจกรรมพื้นฐาน
//in base activity add this code.
public void adjustFontScale( Configuration configuration) {
configuration.fontScale = (float) 1.0;
DisplayMetrics metrics = getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adjustFontScale( getResources().getConfiguration());
}
สิ่งนี้อาจช่วยได้ เพิ่มรหัสในแอปพลิเคชันที่กำหนดเองหรือ BaseActivity ของคุณ
/**
* 重写 getResource 方法,防止系统字体影响
*
* @return
*/
@Override
public Resources getResources() {
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
อย่างไรก็ตาม Resource # updateConfiguration จะแสดงอยู่ใน API ระดับ 25 ซึ่งหมายความว่าจะไม่ได้รับการสนับสนุนในอนาคต
คุณสามารถใช้รหัสนี้:
android:textSize="32dp"
มันแก้ปัญหาของคุณ แต่คุณต้องรู้ว่าคุณควรเคารพการตัดสินใจของผู้ใช้ โดยการเปลี่ยนขนาดตัวอักษรจากการตั้งค่าอุปกรณ์จะไม่เปลี่ยนค่านี้ เพื่อที่ว่าทำไมคุณต้องใช้SPแทนDP ดังนั้นข้อเสนอแนะของฉันคือการตรวจสอบแอปของคุณด้วยขนาดแบบอักษรของระบบที่แตกต่างกัน (เล็ก, ปกติ, ใหญ่, ... )
สำหรับ kotlin มันใช้งานได้สำหรับฉัน
priceTextView.textSize = 12f
เปลี่ยน DP เป็น sp เป็น pratice ที่ดีสำหรับ Android android: textSize = "18sp"
หากหน่วยที่ใช้คือ SP ไม่ใช่ DP และคุณต้องการแทนที่การปรับขนาดแบบอักษรของระบบสิ่งที่คุณทำคือแทนที่หนึ่งวิธีในกิจกรรม - ดูโพสต์นี้
resources.updateConfigurationเลิกใช้แล้วและมีข้อผิดพลาด (บน Oreo ฉันมีปัญหากับข้อความที่จัดรูปแบบ)
แทนที่getResources()
ในกิจกรรม
กำหนดขนาดของ TextView เป็น sp เหมือนปกติ android:textSize="32sp"
override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1F
updateConfiguration(configuration, displayMetrics)
}
}
ใน Android 8 วิธีนี้ใช้งานได้สำหรับฉัน
เพิ่มรหัสนี้ในกิจกรรมพื้นฐาน
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
final Configuration override = new Configuration(newBase.getResources().getConfiguration());
override.fontScale = 1.0f;
applyOverrideConfiguration(override);
}