Я хочу указать свой собственный размер текста в моем приложении, но у меня возникла проблема с этим.
Когда я изменяю размер шрифта в настройках устройства, размер шрифта моего приложения TextView
также изменяется.
Я хочу указать свой собственный размер текста в моем приложении, но у меня возникла проблема с этим.
Когда я изменяю размер шрифта в настройках устройства, размер шрифта моего приложения TextView
также изменяется.
Ответы:
На самом деле, размер шрифта Настройки влияет только на размеры в sp
. Так что все , что нужно сделать - определить textSize
в dp
вместо sp
, то настройки не изменит размер текста в вашем приложении.
Вот ссылка на документацию: Размеры
Однако обратите внимание, что ожидаемое поведение заключается в том, что шрифты во всех приложениях соответствуют предпочтениям пользователя. Есть много причин, по которым пользователь может захотеть изменить размеры шрифта, и некоторые из них могут даже быть медицинскими пользователями с нарушениями зрения. Использование dp
вместо sp
текста может привести к нежелательной дискриминации некоторых пользователей вашего приложения.
то есть:
android:textSize="32dp"
sp
и когда я должен использовать dp
. Я получил очень хороший ответ здесь: stackoverflow.com/questions/11638691/…
Самый простой способ сделать это - использовать что-то вроде следующего:
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
система использует значения по умолчанию.
Не стоит снова указывать DIP или SP по коду, если он уже определен в файле измерения .xml.
Я думаю, что лучший вариант - использовать PX при использовании значения измерения .xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
Таким образом, вы можете переключаться с DP на SP, если это необходимо, в файле измерения.xml без необходимости изменения кода.
Простой способ предотвратить воздействие всего приложения на размер системного шрифта - обновить конфигурацию, используя базовое действие.
//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());
}
это может помочь добавьте код в ваше пользовательское приложение или 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, что означает, что когда-нибудь в будущем он не будет поддерживаться.
Вы можете использовать этот код:
android:textSize="32dp"
это решает вашу проблему, но вы должны знать, что вы должны уважать решения пользователей. при этом изменение размера текста из настроек устройства не изменит это значение. вот почему вам нужно использовать sp вместо dp . Поэтому я предлагаю рассмотреть ваше приложение с различными размерами системного шрифта (маленький, нормальный, большой, ...)
для котлина, у меня работает
priceTextView.textSize = 12f
Если используются единицы SP, а не DP, и вы хотите переопределить масштабирование системного шрифта, все, что вам нужно сделать, это переопределить один метод в действии - см. Этот пост .
resources.updateConfiguration устарела и содержит ошибки (на Oreo у меня были проблемы с форматированным текстом).
В 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);
}