Spanish Se puede cambiar fuente del sistema Android?

Sergio Castellari

Active Member
Licensed User
Hola,
¿Se puede leer la fuente del sistema Android y, si es diferente de la predeterminada, cambiarla para nuestra aplicación?
Necesito que mi aplicación funcione con la fuente predeterminada.

Saludos,
Sergio
 

oparra

Well-Known Member
Licensed User
Puedes especificar en el manifiesto o en el archivo style.xml los fonts que usa tu APP.

ver;

Revisa como se crean los recursos de la APP y te dará una idea de como especificar los fonts.
 
Last edited:

oparra

Well-Known Member
Licensed User
ejemplo:
XML:
CreateResource(values, theme.xml,
<resources>
    <style name="MyTheme" parent="android:Theme.Holo">
        <item name="android:fontFamily">@font/CustomFontStyle</item>
        <item name="fontFamily">@font/CustomFontStyle</item>
    </style>
</resources>
)
SetApplicationAttribute(android:theme, "@style/MyTheme")
 

Sergio Castellari

Active Member
Licensed User
ejemplo:
XML:
CreateResource(values, theme.xml,
<resources>
    <style name="MyTheme" parent="android:Theme.Holo">
        <item name="android:fontFamily">@font/CustomFontStyle</item>
        <item name="fontFamily">@font/CustomFontStyle</item>
    </style>
</resources>
)
SetApplicationAttribute(android:theme, "@style/MyTheme")

Gracias @oparra
Creo que te conteste tambien en el foro ingles sin saber que lo habias hecho por aqui en castellano. Gracias!
Bueno, copie tu codigo en mi manifiesto pero me salta un error que no se de que se trata (adjunte la captura aunque no sé si lo hice correctamente)

Lo que pretendo es que mi APP, independientemente del tamaño elegido por el usuario final, siempre sea el mismo.
Saludos!
Sergio
 

Attachments

  • errorB4A.png
    errorB4A.png
    16.4 KB · Views: 29

oparra

Well-Known Member
Licensed User
Revisa encontraras variantes de font
Ejemplo:
Medium:
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">normal</item>

otro:
 

Sergio Castellari

Active Member
Licensed User
Sergio, el error es que no especificas el font a utilizar.

El font indicado en el manifiesto es solo un ejemplo.



Adjunta el manifiesto para revisar.

Saludos.
Hola @oparra ,

Este es el manifiesto completo (ahi le puse la fuente Sans_Serif) pero da el error que indico mas arriba...
B4X:
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
AddManifestText(
<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  android:maxSdkVersion="19" />)
AddPermission(android.permission.READ_PHONE_STATE)
AddPermission(android.permission.INTERNET)

SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
CreateResourceFromFile(Macro, Themes.DarkTheme)
CreateResourceFromFile(Macro, Core.NetworkClearText)

CreateResource(values, theme.xml,
<resources>
    <style name="MyTheme" parent="android:Theme.Holo">
        <item name="android:fontFamily">@font/Sans_Serif</item>
        <item name="fontFamily">@font/Sans_Serif</item>
    </style>
</resources>
)
SetApplicationAttribute(android:theme, "@style/MyTheme")

'End of default text.
 

Sergio Castellari

Active Member
Licensed User
Revisa encontraras variantes de font
Ejemplo:


otro:
@oparra,

Ahora edite el manifiesto asi: (y sigue dando el error de que NO ENCUENTRA el Font)
B4X:
CreateResource(values, theme.xml,
<resources>
    <style name="MyTheme" parent="android:Theme.Holo">
        <item name="android:fontFamily">@font/sans-serif</item>
        <item name="android:textStyle">normal</item>
    </style>
</resources>
)
SetApplicationAttribute(android:theme, "@style/MyTheme")
B4X:

Enlazando los recursos Error
res\values\theme.xml:4: error: resource font/sans-serif (aka b4a.gestionAPP:font/sans-serif) not found.
error: failed linking references.
 

oparra

Well-Known Member
Licensed User
Puedes aclararme que deseas hacer.

1.Estas utilizando un tema DarkTheme ??
CreateResourceFromFile(Macro, Themes.DarkTheme)

2. Deseas que el usuario de tu APP no pueda cambiar:
a.- Fuente de letras (Font Family)
b.- Tamaño de letras
c.- otros ???
 

Sergio Castellari

Active Member
Licensed User
Puedes aclararme que deseas hacer.

1.Estas utilizando un tema DarkTheme ??


2. Deseas que el usuario de tu APP no pueda cambiar:
a.- Fuente de letras (Font Family)
b.- Tamaño de letras
c.- otros ???
@oparra
Deseo que el usuario de la APP, NO PUEDA cambiar el Tamaño de letras.
Es decir, siempre sea el mismo tamaño aunque cambie el tamaño de las fuentes en el dispositivo.
Saludos
 

fbritop

Active Member
Licensed User
Sergio,
Yo hice eso hace un tiempo (fue harto mas complejo para B4I eso si).

Basicamente al iniciar el B4XMainPage, llamo a una sub testFont

Esta agrega un label y va probando un string, que yo se que es el que quiero como base para el ancho de la pantalla del usuario. Una vez que encuentra ese valor, define esta variable como Escala Basal.

Luego, en un modulo de codigo, tengo declarados los tamaños, en este caso 7, los cuales utilizo a través de toda la App, basado en escalar el tamaño basal.

B4X:
    Dim lblTest As Label
    
    lblTest.Initialize("")
    Root.AddView(lblTest, 0,xc.width(20),GetDeviceLayoutValues.Width, 50dip)
    Dim baseScale As Float=0
    Dim size As Float=15
    Do While baseScale=0
        'cs.Initialize()size(size).Typeface(xc.fontNormal).Color(Colors.Black).Append("BlueToothBlueToothBlueToothBlueTooth").PopAll
        b4xv=lblTest
        b4xv.Font=xc.b4xFontNormal(size)
        
        lblTest.Text="BlueToothBlueToothBlueToothBlueTooth"
        cv.Initialize(lblTest)
        Dim b4xr As B4XRect
        b4xr=cv.MeasureText("BlueToothBlueToothBlueToothBlueTooth", xc.b4xFontNormal(size))
        If b4xr.Width>GetDeviceLayoutValues.Width Then
            baseScale=size-0.2
            
        End If
        size=size+0.2
    Loop
    xc.removeView(lblTest)
    xc.titleSize=baseScale
    xc.subTitleSize=baseScale*0.8
    xc.bigSize=baseScale*1.5
    xc.superBigSize=baseScale*2
    xc.smallSize=baseScale*0.6
    xc.badgeSize=baseScale*0.5

Para normalizar y optimizar el uso de distintas variantes de las fuentes, tengo varias subs en el modulo de codigo que me permiten generar las variantes y tambien los tamaños obtenidos anteriormente, tanto para B4I como B4A:

B4X:
Dim B4XFuente as B4XFont=xc.b4xFontNormal(xc.titleSize) 'Compatible con B4I/A

Sub b4xFontNormal(size As Float) As B4XFont
    #if b4A
    Return XUI.CreateFont(Typeface.LoadFromAssets("SF-UI-Display-Normal.ttf"),size)
    #end if
    #if b4i
    Return XUI.CreateFont(fontNormal(size),size)
    #End If
End Sub

@oparra
Deseo que el usuario de la APP, NO PUEDA cambiar el Tamaño de letras.
Es decir, siempre sea el mismo tamaño aunque cambie el tamaño de las fuentes en el dispositivo.
Saludos
 

Sergio Castellari

Active Member
Licensed User
Sergio,
Yo hice eso hace un tiempo (fue harto mas complejo para B4I eso si).

Basicamente al iniciar el B4XMainPage, llamo a una sub testFont

Esta agrega un label y va probando un string, que yo se que es el que quiero como base para el ancho de la pantalla del usuario. Una vez que encuentra ese valor, define esta variable como Escala Basal.

Luego, en un modulo de codigo, tengo declarados los tamaños, en este caso 7, los cuales utilizo a través de toda la App, basado en escalar el tamaño basal.

B4X:
    Dim lblTest As Label
   
    lblTest.Initialize("")
    Root.AddView(lblTest, 0,xc.width(20),GetDeviceLayoutValues.Width, 50dip)
    Dim baseScale As Float=0
    Dim size As Float=15
    Do While baseScale=0
        'cs.Initialize()size(size).Typeface(xc.fontNormal).Color(Colors.Black).Append("BlueToothBlueToothBlueToothBlueTooth").PopAll
        b4xv=lblTest
        b4xv.Font=xc.b4xFontNormal(size)
       
        lblTest.Text="BlueToothBlueToothBlueToothBlueTooth"
        cv.Initialize(lblTest)
        Dim b4xr As B4XRect
        b4xr=cv.MeasureText("BlueToothBlueToothBlueToothBlueTooth", xc.b4xFontNormal(size))
        If b4xr.Width>GetDeviceLayoutValues.Width Then
            baseScale=size-0.2
           
        End If
        size=size+0.2
    Loop
    xc.removeView(lblTest)
    xc.titleSize=baseScale
    xc.subTitleSize=baseScale*0.8
    xc.bigSize=baseScale*1.5
    xc.superBigSize=baseScale*2
    xc.smallSize=baseScale*0.6
    xc.badgeSize=baseScale*0.5

Para normalizar y optimizar el uso de distintas variantes de las fuentes, tengo varias subs en el modulo de codigo que me permiten generar las variantes y tambien los tamaños obtenidos anteriormente, tanto para B4I como B4A:

B4X:
Dim B4XFuente as B4XFont=xc.b4xFontNormal(xc.titleSize) 'Compatible con B4I/A

Sub b4xFontNormal(size As Float) As B4XFont
    #if b4A
    Return XUI.CreateFont(Typeface.LoadFromAssets("SF-UI-Display-Normal.ttf"),size)
    #end if
    #if b4i
    Return XUI.CreateFont(fontNormal(size),size)
    #End If
End Sub
Hola @fbritop !!!
Desde el vamos, gracias!!!
Amigo tu estas varios escalones arriba!!!...Ojala pueda llegar a tener tu mismo control, pero desde el vamos hay varias cosas que no las entiendo:
a) Esta linea: 4xr=cv.MeasureText("BlueToothBlueToothBlueToothBlueTooth", xc.b4xFontNormal(size))
b) de donde sale "xc" ?
c) No logro comprender que "haces" al medir? el ancho del label?

Perdona mi ignorancia, soy mas o menos nuevos en esto y además estoy retomando ya que ahora tengo más horas disponibles.
Saludos
 

fbritop

Active Member
Licensed User
@Sergio Castellari
xc es un modulo que tengo (global) de funciones.
cv es un canvas, el cual puede medir el rectangulo (B4XRect) de las dimensiones del texto al inicialiar el canvas con el label
Lo que hago es desde un texto pequeño, empezar a agrandar la fuente en el label, hasta que la medida del canvas, sea mayor que el 100%x, eso significa que la cantidad de caracteres visibles, por ende el tamaño del texto que requiero para el usuario, esta OK, entonces salgo del loop y el ultimo valor es mi escala "basal"

b4xFontNormal(size), es una funcion que me retornala fuente B4XFont con el tamaño que va aumentando en el loop. B4XFontNormal te retorna la fuente en B4X, y yo estoy utilizando mis propias fuentes (no las del sistema). Aca hay dos capturas, una de un Xiaomi con pantalla grande y otro de un HW P30 (bastante mas chico).Si te fijas son diferentes las resoluciones, pero aun asi la proporcionalidad de la fuente permance estable en ambos dispositivos.

1628890843718.png


1628890901774.jpeg
 

Sergio Castellari

Active Member
Licensed User
@Sergio Castellari
xc es un modulo que tengo (global) de funciones.
cv es un canvas, el cual puede medir el rectangulo (B4XRect) de las dimensiones del texto al inicialiar el canvas con el label
Lo que hago es desde un texto pequeño, empezar a agrandar la fuente en el label, hasta que la medida del canvas, sea mayor que el 100%x, eso significa que la cantidad de caracteres visibles, por ende el tamaño del texto que requiero para el usuario, esta OK, entonces salgo del loop y el ultimo valor es mi escala "basal"

b4xFontNormal(size), es una funcion que me retornala fuente B4XFont con el tamaño que va aumentando en el loop. B4XFontNormal te retorna la fuente en B4X, y yo estoy utilizando mis propias fuentes (no las del sistema). Aca hay dos capturas, una de un Xiaomi con pantalla grande y otro de un HW P30 (bastante mas chico).Si te fijas son diferentes las resoluciones, pero aun asi la proporcionalidad de la fuente permance estable en ambos dispositivos.

View attachment 117786

View attachment 117788
@fbritop ahora voy entendiendote un poco más. Tu explicacion muy clara, mi compresión mas o menos!
Basicamente vos estarias "midiendo" un texto. Y de acuerdo al tamaño de font predeterminado del dispositivo, obtenes un COEFICINTE (basescale), y con ello determinas los FONTs que vos usas en tu APP (que si mi interpretacion es correcta, serian 6 tamaños de Font).
Entonces de esta forma, si el dispositivo tiene mayor tamaño vos ajustas tus fonts a esa escala y si tiene menor tamaño, lo haces reduciendo tus fonts...
Obviamente para ello, dijiste que usas tus fonts....y de donde los obtenes? y como los aplicas cuando trabajas con el "diseñador" ?
Por lo que entiendo, una vez determinado "tu concepto" simplemente todos tus APPs respetan este diseño, y ya no tendrias ningun problema con cualquier resolucion del dispositivo, verdad?
 

oparra

Well-Known Member
Licensed User
Sergio.

He visto que que te han dado varias soluciones con respecto a lo que deseas.

Solo puedo darte mis observaciones.

Yo defino todos los diseños de las pantallas con anclajes y un poco de scripts para que se ajusten a cualquier dispositivo.

y si deseo que el usuario no cambie el tamaños de los objetos (screen) y fonts en el caso de B4A lo especifico en el manifiesto.

Saludos,
 

Sergio Castellari

Active Member
Licensed User
Sergio.

He visto que que te han dado varias soluciones con respecto a lo que deseas.

Solo puedo darte mis observaciones.

Yo defino todos los diseños de las pantallas con anclajes y un poco de scripts para que se ajusten a cualquier dispositivo.

y si deseo que el usuario no cambie el tamaños de los objetos (screen) y fonts en el caso de B4A lo especifico en el manifiesto.

Saludos,
y si deseo que el usuario no cambie el tamaños de los objetos (screen) y fonts en el caso de B4A lo especifico en el manifiesto.
¿Como es esto?...parece interensante...

Segun la ayuda que me ofrecieron, hice esto y funciona en distintos tamaños de fuente predeterminado:

B4X:
Public access        As Accessibility
Public pSysFontScale As Float = access.GetUserFontScale

'Ajusto tamaños de fuentes SIN importar el tamaño de fuente elegida por el Usuario...
    Label1.TextSize = Label1.TextSize/Main.pSysFontScale
    Label2.TextSize = Label2.TextSize/Main.pSysFontScale
    CheckBox1.TextSize = CheckBox1.TextSize/Main.pSysFontScale
    btnSalir.TextSize = btnSalir.TextSize/Main.pSysFontScale
    btnAcceder.TextSize = btnAcceder.TextSize/Main.pSysFontScale
    EditText1.TextSize = EditText1.TextSize/Main.pSysFontScale
    EditText2.TextSize = EditText2.TextSize/Main.pSysFontScale

Saludos y gracias!
 
Top