El tamaño de fuente de TextView en la aplicación de Android cambia al cambiar el tamaño de fuente de la configuración nativa


172

Quiero especificar mi propio tamaño de texto en mi aplicación, pero tengo problemas para hacerlo.

Cuando cambio el tamaño de fuente en la configuración del dispositivo, el tamaño de fuente de mi aplicación TextViewtambién cambia.


2
El comportamiento predeterminado es que si cambia el tamaño de fuente de la fuente nativa de su dispositivo, también afectará el tamaño de fuente de su aplicación.
Shreyash Mahajan

puedes encontrar la respuesta aquí stackoverflow.com/questions/16706076/…
Bhavesh Jethani

Use sp para el tamaño del texto ... porque pero está escalado por la preferencia de tamaño de fuente del usuario. Usa dp para todo lo demás.
live-love

Respuestas:


232

En realidad, el tamaño de fuente de Configuración afecta solo los tamaños en sp. Entonces, todo lo que necesita hacer: definir textSizeen dplugar de sp, la configuración no cambiará el tamaño del texto en su aplicación.

Aquí hay un enlace a la documentación: Dimensiones

Sin embargo, tenga en cuenta que el comportamiento esperado es que las fuentes en todas las aplicaciones respetan las preferencias del usuario. Hay muchas razones por las que un usuario puede querer ajustar los tamaños de fuente y algunas de ellas incluso pueden ser usuarios con discapacidad visual médica. Usar en dplugar de sppara texto puede conducir a una discriminación involuntaria contra algunos de los usuarios de su aplicación.

es decir:

android:textSize="32dp"

12
Hace mucho tiempo quería saber si había alguna regla sobre cuándo debería usar spy cuándo debería usar dp. Obtuve una muy buena respuesta aquí: stackoverflow.com/questions/11638691/…
Sam

129

Lo más fácil es simplemente usar algo como lo siguiente:

android:textSize="32sp"

Si desea saber más sobre el textSize propiedad, puede consultar la documentación del desarrollador de Android .


1
esta es la razón por la cual el TS tiene el problema, usando 'sp' en lugar de 'dp'
Boy

8
Todavía no sé por qué hay 100 votos a favor. porque si usamos sp para establecer el tamaño del texto en la aplicación. Luego cambiamos el tamaño de fuente en Configuración, TextView en la aplicación también cambia
Phan Van Linh

¿Cómo responde esto a la pregunta?
Siddarth G

48

Utilizar el dimension tipo de recursos como usa los stringrecursos ( DOCS ).

En tus dimens.xml archivo, declare sus variables de dimensión:

<?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>

Entonces puede usar estos valores como este:

<TextView
   android:layout_height="@dimen/textview_height"
   android:layout_width="@dimen/textview_width"
   android:textSize="@dimen/font_size"/>

Puedes declarar diferente dimens.xml archivos para diferentes tipos de pantallas. Hacer esto garantizará el aspecto deseado de su aplicación en diferentes dispositivos.

Cuando no especifica android:textSizeel sistema usa los valores predeterminados.


1
El problema no son las pantallas. Es el tamaño de fuente nativo seleccionado en la configuración de pantalla de Android lo que lleva al problema mencionado
Himanshu Virmani

24

También tenga en cuenta que si textSize está configurado en código, llamar textView.setTextSize(X)interpreta el número (X) como SP. Use setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)para establecer valores en dp .


13

No es bueno tener que especificar DIP o SP nuevamente por código cuando ya está definido en un archivo dimen.xml.

Creo que la mejor opción es usar PX cuando se usa un valor dimen.xml:

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

De esta manera, puede cambiar de DP a SP si es necesario en el archivo dimen.xml sin tener que cambiar ningún código.


6

Una forma sencilla de evitar que toda la aplicación se vea afectada por el tamaño de fuente del sistema es actualizar la configuración utilizando una actividad base.

//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

Esto puede ayudar. agregue el código en su aplicación personalizada o 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;
}

sin embargo, Resource # updateConfiguration se aplica en el nivel de API 25, lo que significa que no será compatible algún día en el futuro.


1

Puedes usar este código:

android:textSize="32dp"

resuelve su problema, pero debe saber que debe respetar las decisiones del usuario. con esto, cambiar el tamaño del texto desde la configuración del dispositivo no cambiará este valor. por eso es necesario usar sp en lugar de dp . Entonces, mi sugerencia es revisar su aplicación con diferentes tamaños de fuente del sistema (pequeño, normal, grande, ...)



1

cambiar el DP a sp es una buena práctica para Android Android: textSize = "18sp"


0

Si las unidades utilizadas son SP, no DP, y desea anular el escalado de la fuente del sistema, todo lo que debe hacer es anular un método en actividad; consulte esta publicación .

resources.updateConfiguration está en desuso y tiene errores (en Oreo tuve problemas con el texto formateado).


0

Anular getResources() en actividad.

Establezca el tamaño de TextView en sp como de costumbre, como android:textSize="32sp"

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

0

en Android 8 esta solución funciona para mí

agregue este código en la actividad base

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    final Configuration override = new Configuration(newBase.getResources().getConfiguration());
    override.fontScale = 1.0f;
    applyOverrideConfiguration(override);
}

fuente https://stackoverflow.com/a/57225687/7985871

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.