Tôi muốn chỉ định kích thước văn bản của riêng tôi trong ứng dụng của tôi, nhưng tôi gặp vấn đề khi làm điều này.
Khi tôi thay đổi kích thước phông chữ trong cài đặt thiết bị, kích thước phông chữ của ứng dụng của tôi TextView
cũng thay đổi.
Tôi muốn chỉ định kích thước văn bản của riêng tôi trong ứng dụng của tôi, nhưng tôi gặp vấn đề khi làm điều này.
Khi tôi thay đổi kích thước phông chữ trong cài đặt thiết bị, kích thước phông chữ của ứng dụng của tôi TextView
cũng thay đổi.
Câu trả lời:
Trên thực tế, kích thước phông chữ Cài đặt chỉ ảnh hưởng đến kích thước sp
. Vì vậy, tất cả Bạn cần phải làm - xác định textSize
trong dp
thay vì sp
, sau đó thiết lập này sẽ không thay đổi kích thước văn bản trong ứng dụng của bạn.
Đây là một liên kết đến tài liệu: Kích thước
Tuy nhiên, xin lưu ý rằng hành vi dự kiến là phông chữ trong tất cả các ứng dụng tôn trọng tùy chọn của người dùng. Có nhiều lý do người dùng có thể muốn điều chỉnh kích thước phông chữ và một số trong số họ thậm chí có thể là y tế - người dùng khiếm thị. Sử dụng dp
thay vì sp
cho văn bản có thể dẫn đến việc miễn cưỡng phân biệt đối xử với một số người dùng ứng dụng của bạn.
I E:
android:textSize="32dp"
sp
và khi nào tôi nên sử dụng dp
. Tôi đã nhận được phản hồi thực sự tốt ở đây: stackoverflow.com/questions/11638691/ Khăn
Cách dễ nhất để làm như vậy chỉ đơn giản là sử dụng một cái gì đó như sau:
android:textSize="32sp"
Nếu bạn muốn biết thêm về textSize
tài sản, bạn có thể kiểm tra tài liệu dành cho nhà phát triển Android .
Sử dụng dimension
loại tài nguyên như bạn sử dụng string
tài nguyên ( DOCS ).
Trong dimens.xml
tệp của bạn , khai báo các biến thứ nguyên của bạn:
<?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>
Sau đó, bạn có thể sử dụng các giá trị như thế này:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
Bạn có thể khai báo khác nhau dimens.xml
tệp khác nhau cho các loại màn hình khác nhau. Làm điều này sẽ đảm bảo giao diện mong muốn của ứng dụng của bạn trên các thiết bị khác nhau.
Khi bạn không chỉ định android:textSize
hệ thống sẽ sử dụng các giá trị mặc định.
Sẽ không phải là một điều tốt khi phải chỉ định lại DIP hoặc SP theo mã khi đã được xác định trong tệp dimen.xml.
Tôi nghĩ rằng tùy chọn tốt nhất là sử dụng PX khi sử dụng giá trị dimen.xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
Theo cách này, bạn có thể chuyển từ DP sang SP nếu cần trong tệp dimen.xml mà không phải thay đổi bất kỳ mã nào.
Cách đơn giản để ngăn toàn bộ ứng dụng bị ảnh hưởng bởi kích thước phông chữ hệ thống là cập nhật cấu hình bằng cách sử dụng một hoạt động cơ bản.
//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());
}
Điều này có thể giúp. thêm mã trong Ứng dụng tùy chỉnh hoặc BaseActivity của bạn
/**
* 重写 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;
}
tuy nhiên, Resource # updateConfiguration được mô tả trong API cấp 25, điều đó có nghĩa là nó sẽ không được hỗ trợ vào một ngày nào đó trong tương lai.
Bạn có thể sử dụng mã này:
android:textSize="32dp"
nó giải quyết vấn đề của bạn nhưng bạn phải biết rằng bạn nên tôn trọng quyết định của người dùng. bằng cách này, thay đổi kích thước văn bản từ cài đặt thiết bị sẽ không thay đổi giá trị này. Vì vậy, đó là lý do tại sao bạn cần sử dụng sp thay vì dp . Vì vậy, đề xuất của tôi là xem xét ứng dụng của bạn với các kích thước phông chữ hệ thống khác nhau (nhỏ, bình thường, lớn, ...)
đối với kotlin, nó hoạt động với tôi
priceTextView.textSize = 12f
Nếu các đơn vị được sử dụng là SP, không phải DP và bạn muốn ghi đè tỷ lệ phông chữ hệ thống, tất cả những gì bạn làm là ghi đè một phương thức trong hoạt động - xem bài đăng này .
resource.updateConfiguration không được dùng nữa và lỗi (trên Oreo tôi gặp vấn đề với văn bản được định dạng).
trong android 8 giải pháp này hiệu quả với tôi
thêm mã này vào hoạt động cơ sở
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
final Configuration override = new Configuration(newBase.getResources().getConfiguration());
override.fontScale = 1.0f;
applyOverrideConfiguration(override);
}