Розмір шрифту TextView в додатку Android змінюється на зміну розміру шрифту від нативних налаштувань


171

Я хочу вказати власний розмір тексту у своїй програмі, але у мене виникають проблеми з цим.

Коли я змінюю розмір шрифту в налаштуваннях пристрою, розмір шрифту моєї програми TextViewтакож змінюється.


2
це поведінка за замовчуванням, що якщо ви зміните розмір шрифту власного шрифту вашого пристрою, це також вплине на розмір шрифту програми.
Шреяш Махаджан

Ви можете знайти відповідь тут stackoverflow.com/questions/16706076 / ...
Bhavesh Jethani

Використовуйте sp для розміру тексту ..., оскільки він масштабується за допомогою налаштувань шрифту користувача. Використовуйте dp для всього іншого.
live-love

Відповіді:


231

Насправді розмір шрифту Налаштування впливає лише на розміри в sp. Так що все , що потрібно зробити - визначити textSizeв dpзамістьsp , то настройки не змінить розмір тексту в вашому додатку.

Ось посилання на документацію: Розміри

Однак зауважте, що очікувана поведінка полягає в тому, що шрифти в усіх додатках відповідають параметрам користувача. Є багато причин, за якими користувач може захотіти коригувати розміри шрифту, а деякі з них можуть бути навіть медичними особами з вадами зору. Використання тексту dpзамість spтексту може призвести до небажаної дискримінації деяких користувачів вашого додатка.

тобто:

android:textSize="32dp"

12
Довгий час назад я хотів знати, чи є якесь правило, коли я повинен використовувати spі коли я повинен використовувати dp. Я отримав дуже хорошу відповідь тут: stackoverflow.com/questions/11638691 / ...
Sam

129

Найпростіше зробити це просто скористатися чимось подібним:

android:textSize="32sp"

Якщо ви хочете дізнатися більше про textSizeоб’єкт, ви можете перевірити документацію для розробників Android .


1
це насправді, чому TS має проблему, використовуючи 'sp' замість 'dp'
Хлопчик

8
Я досі не знаю, чому є 100 грошей. тому що якщо ми використовуємо sp для набору textize в застосуванні. Потім ми змінюємо розмір шрифту в Setting, TextView в додатку також змінюється
Phan Van Linh

як це відповідає на питання?
Siddarth G

48

Використовуйте 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система використовує значення за замовчуванням.


1
питання не екрани. Саме розмір рідного шрифту, вибраний у налаштуваннях дисплея для Android, призводить до згаданої проблеми
Himanshu Virmani

24

Також зауважте, що якщо textSize встановлений у коді, виклик textView.setTextSize(X)інтерпретує число (X) як SP. Використовуйте setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)для встановлення значень у dp .


13

Не годиться знову вказувати DIP або SP за кодом, коли це вже визначено у файлі dimen.xml.

Я думаю, що найкращим варіантом є використання PX при використанні значення dimen.xml:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));

Таким чином, ви можете перейти з DP на SP, якщо потрібно, у розмір.xml файл, не змінюючи жодного коду.


6

Простий спосіб запобігти всьому застосуванню програми за допомогою розміру шрифту системи - оновити конфігурацію за допомогою базової діяльності.

//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

це може допомогти. додайте код у свою власну програму або 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 відображено на рівні 25 API, це означає, що він буде непідтримуваний якийсь день у майбутньому.


1

Ви можете використовувати цей код:

android:textSize="32dp"

це вирішує вашу проблему, але ви повинні знати, що ви повинні поважати рішення користувачів. цим зміною розміру тексту з налаштувань пристрою це значення не змінить. так що тому вам потрібно використовувати sp замість dp . Тому я пропоную переглянути ваш додаток з різними розмірами шрифту системи (маленький, звичайний, великий, ...)




0

Якщо використовувані одиниці - це SP, а не DP, і ви хочете змінити масштаб шрифту системи, все, що ви робите, - це замінити один метод діяльності - дивіться цю публікацію .

resource.updateConfiguration застаріло і баггі (у Oreo у мене виникли проблеми із форматованим текстом).


0

Перевизначення getResources()активності

Встановіть розмір TextView в sp як зазвичай android:textSize="32sp"

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

0

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

джерело https://stackoverflow.com/a/57225687/7985871

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.