tamaño - personalizar textview android studio
El tamaño de la fuente de TextView en la aplicación de Android cambia al cambiar el tamaño de la fuente de la configuración nativa (8)
Deseo especificar mi propio tamaño de texto en mi aplicación, pero tengo un problema para hacer esto.
Cuando cambio el tamaño de la fuente en la configuración del dispositivo, también cambia el tamaño de fuente de la aplicación TextView
.
En realidad, el tamaño de la fuente de configuración solo afecta a los tamaños en sp
. Entonces, todo lo que tiene que hacer es definir textSize
en dp
en lugar de sp
, luego la configuración no cambiará el tamaño del texto en su aplicación.
Aquí hay un enlace a la documentación: Dimensions
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 cuales un usuario puede querer ajustar el tamaño de las fuentes y algunas de ellas incluso pueden ser médicas: usuarios con discapacidad visual. Usar dp
lugar de sp
para el texto puede llevar a discriminar de forma involuntaria contra algunos de los usuarios de su aplicación.
La forma simple de evitar que toda la aplicación se vea afectada por el tamaño de fuente del sistema es actualizar la configuración mediante 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());
}
Lo más fácil es simplemente usar algo como lo siguiente:
android:textSize="32sp"
Si desea obtener más información sobre la propiedad textSize
, puede consultar la documentación del desarrollador de Android .
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 al usar un valor de dimen.xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
De esta forma, puede cambiar de DP a SP si es necesario en el archivo dimen.xml sin tener que cambiar ningún código.
También tenga en cuenta que si textSize está configurado en código, la invocación de textView.setTextSize(X)
interpreta el número (X) como SP. Use setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
para establecer valores en dp .
Usar tamaño de fuente en DP en lugar de SP en textSize
resuelve esto.
Use el tipo de dimension
de recursos como si usa recursos de string
( Dimensions ).
En su archivo dimens.xml
, 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 puedes usar estos valores como este:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
Puede declarar diferentes archivos dimens.xml
para diferentes tipos de pantallas. Hacer esto garantizará el aspecto deseado de su aplicación en diferentes dispositivos.
Cuando no especificas android:textSize
el sistema usa los valores predeterminados.
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 utiliza en el nivel de API 25, lo que significa que no se admitirá algún día en el futuro.