it-roy-ru.com

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

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

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

140
VicJordan

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

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

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

то есть: 

Android:textSize="32dp"
192
sandrstar

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

Android:textSize="32sp"

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

127
Evan Long

Используйте ресурсы типа 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, система использует значения по умолчанию.

43
ashakirov

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

23
Arpit

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

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

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

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

12
mba

простой способ предотвратить воздействие всего приложения на размер системного шрифта - обновить конфигурацию, используя базовое действие.

//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());
}
4
Usama Saeed US

это может помочь добавьте код в ваше пользовательское приложение или 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
Arno_J

Использование размера шрифта в DPs вместо SPs в textSize решает проблему.

1
bpr10

Вы должны написать в TextView Теги в XML:

Android:textSize="32dp"
1
neha

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

Установите размер TextView в sp как обычно, как Android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}
0
jay

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

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

0
Maxim Saplin

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

Android:textSize="32dp"

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

0
Hossein Karami