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

172

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

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

Викасдип Сингх
источник
2
это поведение по умолчанию, если вы изменяете размер шрифта собственного шрифта устройства, это также влияет на размер шрифта вашего приложения.
Шреяш Махаджан
Вы можете найти ответ здесь stackoverflow.com/questions/16706076/…
Бхавеш Джетани
Используйте sp для размера текста… потому что он масштабируется в соответствии с настройками размера шрифта пользователя. Используйте дп для всего остального.
live-love

Ответы:

232

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

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

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

то есть:

android:textSize="32dp"
sandrstar
источник
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система использует значения по умолчанию.

ashakirov
источник
1
проблема не в экранах. Это собственный размер шрифта, выбранный в настройках дисплея Android, что приводит к упомянутой проблеме
Himanshu Virmani
24

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

Arpit
источник
13

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

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

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

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

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

Arno_J
источник
1

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

android:textSize="32dp"

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

Хоссейн Карами
источник
1

для котлина, у меня работает

priceTextView.textSize = 12f
Шихаб Уддин
источник
1

поменяйте DP на sp это хорошая практика для android android: textSize = "18sp"

Санджай
источник
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

эмад пираеш
источник