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 TextView
también cambia.
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 TextView
también cambia.
Respuestas:
En realidad, el tamaño de fuente de Configuración afecta solo los tamaños en sp
. Entonces, todo lo que necesita hacer: definir textSize
en dp
lugar 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 dp
lugar de sp
para texto puede conducir a una discriminación involuntaria contra algunos de los usuarios de su aplicación.
es decir:
android:textSize="32dp"
sp
y cuándo debería usar dp
. Obtuve una muy buena respuesta aquí: stackoverflow.com/questions/11638691/…
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 .
Utilizar el dimension
tipo de recursos como usa los string
recursos ( 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:textSize
el sistema usa los valores predeterminados.
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.
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());
}
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.
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, ...)
para kotlin, me funciona
priceTextView.textSize = 12f
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).
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)
}
}
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);
}