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

134

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

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

  • 2
    это поведение по умолчанию, если вы изменяете размер шрифта собственного шрифта устройства, это также влияет на размер шрифта вашего приложения.
  • 0
    Вы можете найти ответ здесь stackoverflow.com/questions/16706076/…
Показать ещё 1 комментарий
Теги:
android-textview
android-layout
android-fonts

9 ответов

176
Лучший ответ

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

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

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

то есть:

android:textSize="32dp"
  • 9
    Давным-давно я хотел знать, есть ли какое-либо правило, когда мне следует использовать sp и когда мне следует использовать dp . Я получил очень хороший ответ здесь: stackoverflow.com/questions/11638691/…
120

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

android:textSize="32sp"

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

  • 1
    это на самом деле, почему TS имеет проблему, используя «sp» вместо «dp»
  • 6
    Я до сих пор не знаю, почему 100 голосов. потому что, если мы используем sp для установки textize в приложении. Затем мы меняем размер шрифта в Setting, также меняем TextView в приложении
42

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

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

12

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

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

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

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

2

простой способ предотвратить создание всего приложения по размеру системного шрифта - 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());
}
1

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

0

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

android:textSize="32dp"
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню