Kích thước phông chữ của TextView trong ứng dụng Android thay đổi khi thay đổi kích thước phông chữ từ cài đặt gốc


171

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 TextViewcũng thay đổi.


2
Đó là hành vi mặc định mà nếu bạn thay đổi kích thước phông chữ của phông chữ gốc thiết bị thì nó cũng ảnh hưởng đến kích thước phông chữ ứng dụng của bạn.
Shreyash Mahajan

bạn có thể tìm thấy câu trả lời từ đây stackoverflow.com/questions/16706076/ từ
Bhavesh Jethani

Sử dụng sp cho kích thước văn bản, vì nó được chia tỷ lệ theo sở thích kích thước phông chữ của người dùng. Sử dụng dp cho mọi thứ khác.
sống tình yêu

Câu trả lời:


230

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 textSizetrong dpthay 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 dpthay vì spcho 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"

12
Một lúc lâu sau tôi muốn biết liệu có quy tắc nào khi nào tôi nên sử dụng spvà 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
Sam

129

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ề textSizetài sản, bạn có thể kiểm tra tài liệu dành cho nhà phát triển Android .


1
đây thực sự là lý do tại sao TS có vấn đề, sử dụng 'sp' thay vì 'dp'
Boy

8
Tôi vẫn không biết tại sao có 100 upvote. bởi vì nếu chúng ta sử dụng sp để thiết lập textize trong ứng dụng. Sau đó, chúng tôi thay đổi kích thước phông chữ trong Cài đặt, TextView trong ứng dụng cũng thay đổi
Phan Văn Linh

Làm thế nào để trả lời câu hỏi này?
Siddarth G

48

Sử dụng dimensionloại tài nguyên như bạn sử dụng stringtài nguyên ( DOCS ).

Trong dimens.xmltệ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:textSizehệ thống sẽ sử dụng các giá trị mặc định.


1
vấn đề không phải là màn hình. Đó là kích thước phông chữ gốc được chọn trong cài đặt hiển thị của Android dẫn đến sự cố được đề cập
Himanshu Virmani

24

Cũng lưu ý rằng nếu textSize được đặt trong mã, việc gọi sẽ textView.setTextSize(X)diễn giải số (X) là SP. Sử dụng setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)để đặt giá trị trong dp .


13

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.


6

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

1

Đ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.


1

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, ...)


1

đối với kotlin, nó hoạt động với tôi

priceTextView.textSize = 12f

1

thay đổi DP thành sp nó là một lợi ích tốt cho Android android: textSize = "18sp"


0

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


0

Ghi đè getResources()trong Hoạt động.

Đặt kích thước của TextView trong sp như bình thường như android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}

0

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

nguồn https://stackoverflow.com/a/57225687/7985871

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.