Размер шрифта TextView в приложении Android изменяется при изменении размера шрифта из собственных настроек

Я хочу указать свой собственный размер текста в своем приложении, но у меня возникла проблема с этим.

При изменении размера шрифта в настройках устройства изменяется и размер шрифта моего приложения TextView.

Ответ 1

Фактически, размер шрифта настроек влияет только на размеры в sp. Итак, все, что вам нужно сделать - определить textSize в dp вместо sp, тогда настройки не изменят размер текста в вашем приложении.

Здесь ссылка на документацию: Размеры

Однако учтите, что ожидаемое поведение заключается в том, что шрифты во всех приложениях соответствуют предпочтениям пользователя. Есть много причин, по которым пользователь может захотеть скорректировать размеры шрифта, а некоторые из них могут быть даже медицинскими - с ослабленным зрением. Использование dp вместо sp для текста может привести к неохотной дискриминации некоторых пользователей вашего приложения.

то есть:

android:textSize="32dp"

Ответ 2

Самый простой способ - просто использовать что-то вроде следующего:

android:textSize="32sp"

Если вы хотите узнать больше о свойстве textSize, вы можете проверить документацию разработчика Android.

Ответ 3

Используйте типы ресурсов 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, система использует значения по умолчанию.

Ответ 4

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

Ответ 5

Нехорошо указывать DIP или SP снова кодом, который уже определен в файле dimen.xml.

Я думаю, что лучший вариант - использовать PX при использовании значения dimen.xml:

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

Таким образом, вы можете переключиться с DP на SP, если это необходимо в файле dimen.xml, без необходимости изменять какой-либо код.

Ответ 6

простой способ предотвратить создание всего приложения по размеру системного шрифта - updateConfiguration, используя базовую активность.

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

Ответ 7

Используя размер шрифта в DPs вместо SPs в textSize решает эту проблему.

Ответ 8

это может помочь. добавьте код в свое собственное приложение или 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, что означает, что он будет неподдерживаться в будущем.

Ответ 9

Вы должны писать в тегах TextView в XML:

android:textSize="32dp"

Ответ 10

Если используются единицы измерения SP, а не DP, и вы хотите переопределить масштабирование системного шрифта, все, что вам нужно сделать, это переопределить один метод в действии - см. Этот пост.

resources.updateConfiguration устарела и содержит ошибки (на Oreo у меня были проблемы с форматированным текстом).

Ответ 11

Вы можете использовать этот код:

android:textSize="32dp"

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

Ответ 12

Переопределите getResources() в Activity.

Установите размер TextView в sp как обычно, как android:textSize="32sp"

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