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


172

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

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


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

Вы можете найти ответ здесь stackoverflow.com/questions/16706076/…
Бхавеш Джетани

Используйте sp для размера текста… потому что он масштабируется в соответствии с настройками размера шрифта пользователя. Используйте дп для всего остального.
live-love

Ответы:


232

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

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

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

то есть:

android:textSize="32dp"

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

129

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

android:textSize="32sp"

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


1
именно поэтому у TS есть проблема, использующая 'sp' вместо 'dp'
Boy

8
Я до сих пор не знаю, почему 100 голосов. потому что, если мы используем sp для установки textize в приложении. Затем мы меняем размер шрифта в Настройке, также меняем TextView в приложении
Phan Van Linh

как это отвечает на вопрос?
Сиддарт Г

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)для установки значений в дп .


13

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

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


1

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

android:textSize="32dp"

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




0

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

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


0

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

Установите размер 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.