Я хочу указать свой собственный размер текста в своем приложении, но у меня возникла проблема с этим.
При изменении размера шрифта в настройках устройства изменяется и размер шрифта моего приложения TextView
.
Я хочу указать свой собственный размер текста в своем приложении, но у меня возникла проблема с этим.
При изменении размера шрифта в настройках устройства изменяется и размер шрифта моего приложения TextView
.
Фактически, размер шрифта настроек влияет только на размеры в sp
. Итак, все, что вам нужно сделать - определить textSize
в dp
вместо sp
, тогда настройки не изменят размер текста в вашем приложении.
Здесь ссылка на документацию: Размеры
Однако учтите, что ожидаемое поведение заключается в том, что шрифты во всех приложениях соответствуют предпочтениям пользователя. Есть много причин, по которым пользователь может захотеть скорректировать размеры шрифта, а некоторые из них могут быть даже медицинскими - с ослабленным зрением. Использование dp
вместо sp
для текста может привести к неохотной дискриминации некоторых пользователей вашего приложения.
то есть:
android:textSize="32dp"
Самый простой способ - просто использовать что-то вроде следующего:
android:textSize="32sp"
Если вы хотите узнать больше о свойстве textSize
, вы можете проверить документацию разработчика Android.
Используйте типы ресурсов 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
, система использует значения по умолчанию.
Также обратите внимание, что если textSize задан в коде, вызов textView.setTextSize(X)
интерпретирует число (X) как SP. Используйте setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
для установки значений в dp.
Нехорошо указывать DIP или SP снова кодом, который уже определен в файле dimen.xml.
Я думаю, что лучший вариант - использовать PX при использовании значения dimen.xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
Таким образом, вы можете переключиться с DP на SP, если это необходимо в файле dimen.xml, без необходимости изменять какой-либо код.
простой способ предотвратить создание всего приложения по размеру системного шрифта - 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());
}
Используя размер шрифта в DPs вместо SPs в textSize
решает эту проблему.
это может помочь. добавьте код в свое собственное приложение или 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, что означает, что он будет неподдерживаться в будущем.
Вы должны писать в тегах TextView в XML:
android:textSize="32dp"
Если используются единицы измерения SP, а не DP, и вы хотите переопределить масштабирование системного шрифта, все, что вам нужно сделать, это переопределить один метод в действии - см. Этот пост.
resources.updateConfiguration устарела и содержит ошибки (на Oreo у меня были проблемы с форматированным текстом).
Вы можете использовать этот код:
android:textSize="32dp"
это решает вашу проблему, но вы должны знать, что вы должны уважать решения пользователей. при этом изменение размера текста из настроек устройства не изменит это значение. так что почему вам нужно использовать sp вместо dp. Поэтому я предлагаю рассмотреть ваше приложение с различными размерами системного шрифта (маленький, нормальный, большой,...)
Переопределите getResources()
в Activity.
Установите размер TextView в sp как обычно, как android:textSize="32sp"
override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1F
updateConfiguration(configuration, displayMetrics)
}
}