Я хочу указать свой собственный размер текста в своем приложении, но у меня возникла проблема с этим.
При изменении размера шрифта в настройках устройства изменяется и размер шрифта моего приложения 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
, система использует значения по умолчанию.
Также обратите внимание, что если 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
решает эту проблему.
Вы должны писать в тегах TextView в XML:
android:textSize="32dp"
это может помочь. добавьте код в свое собственное приложение или 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, что означает, что он будет неподдерживаться в будущем.