German Android-Einstellungen "Schriftgröße"

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,
kann ich irgendwie auslesen, wie der Anwender in seinen Displayeinstellungen die Schriftgröße eingestellt hat?

Ich verwende für meine App eine an die Displaygröße und den Scalefaktor angepasste Schrftgröße,
z.B. "Tsize2= (3.0%y)/lv.Scale" oder auch
z.B. "Typeface.Default"
das passt dann z.B. bei eingestellter Schriftgröße "sehr groß" beides nicht mehr in der Optik.

Oder mache ich da was falsch und es gibt es eine andere Möglichkeit das zu lösen?
 
D

Deleted member 103

Guest
Hallo peternmb,

ich stand auch schon vor dem gleiche Problem.
Mit diesem Code-Modul habe ich mein Problem gelöst. Damit wird in deine App die Schriftgröße immer auf normal gesetzt.
B4X:
'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
End Sub

Sub getScale As Float
    Dim access As Accessiblity
    Return access.GetUserFontScale
End Sub

'User-Schriftgröße auf Normal zurücksetzten.
Sub SetPanelTypeface(parent As Panel)
    Dim fscale As Float = getScale
    For Each v As View In parent.GetAllViewsRecursive
        If fscale <> 1 Then
            ChangeFontsize(v, fscale)
        End If
    Next
End Sub

'User-Schriftgröße auf Normal zurücksetzten.
Sub SetActivityTypeface(act As Activity)
    Dim fscale As Float = getScale
    For Each v As View In act.GetAllViewsRecursive
        If fscale <> 1 Then
            ChangeFontsize(v, fscale)
        End If
    Next
End Sub

Private Sub ChangeFontsize(v As View, fscale As Float)
    If v Is Label Then
        Dim lbl As Label = v
        lbl.TextSize = NumberFormat2(lbl.TextSize / fscale,1,0,0,False)
    Else If v Is Button Then
        Dim s As Button = v
        s.TextSize = NumberFormat2(s.TextSize / fscale,1,0,0,False)
    End If
End Sub
 

Bluray

Member
Hallo peternmb,

ich stand auch schon vor dem gleiche Problem.
Mit diesem Code-Modul habe ich mein Problem gelöst. Damit wird in deine App die Schriftgröße immer auf normal gesetzt.
B4X:
'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
End Sub

Sub getScale As Float
    Dim access As Accessiblity
    Return access.GetUserFontScale
End Sub

'User-Schriftgröße auf Normal zurücksetzten.
Sub SetPanelTypeface(parent As Panel)
    Dim fscale As Float = getScale
    For Each v As View In parent.GetAllViewsRecursive
        If fscale <> 1 Then
            ChangeFontsize(v, fscale)
        End If
    Next
End Sub

'User-Schriftgröße auf Normal zurücksetzten.
Sub SetActivityTypeface(act As Activity)
    Dim fscale As Float = getScale
    For Each v As View In act.GetAllViewsRecursive
        If fscale <> 1 Then
            ChangeFontsize(v, fscale)
        End If
    Next
End Sub

Private Sub ChangeFontsize(v As View, fscale As Float)
    If v Is Label Then
        Dim lbl As Label = v
        lbl.TextSize = NumberFormat2(lbl.TextSize / fscale,1,0,0,False)
    Else If v Is Button Then
        Dim s As Button = v
        s.TextSize = NumberFormat2(s.TextSize / fscale,1,0,0,False)
    End If
End Sub

Hallo @Filippo ,

ich weiß der Beitrag ist schon etwas älter, jedoch stehe ich nun vor dem gleichen Problem wie der Threadersteller, dass die Schriftgröße meiner App sich an die Android-Einstellungen anpasst. Ich bin froh diesen Beitrag gefunden zu haben, da es dieses Problem schon mal gab und auch schon eine Lösung vorhanden ist.
Leider stehe ich wohl gerade etwas auf dem Schlauch und weiß nicht genau wie ich dein Codemodul zum laufen bringen kann.
Ich habe es als Code-Modul angelegt und besitze in meiner App zwei Activity-Module, in denen alle Labels etc. vorhanden sind. Wie kann ich nun dein Skalierungsmodul aufrufen und benutzen bzw. wo? Im Starter?

Mit freundlichen Grüßen & Danke im Vorraus
 
D

Deleted member 103

Guest
Hallo @Bluray ,

du kannst die Procedur "SetPanelTypeface" oder "SetActivityTypeface" von jeder Activity starten/ausführen(nicht vom Starter).
Die procedur "SetPanelTypeface" startest wenn nur alle Views von ein Panel ändern willst, und "SetActivityTypeface" wenn die komplette Activity ändern willst.
 

Bluray

Member
Hallo @Filippo

Danke für deine Antwort.
Ich möchte auf jeden Fall beide Activity-Module komplett ändern. Mir ist nur nicht ganz klar, wie ich das SetActivityTypeface aufrufe. Wenn ich z.B. im Activity-Modul "Main" bin und SetActivityTypeface aufrufen möchte, dann in Activity_create oder?
Jedoch bekomme ich jedes mal den Fehler "Undeklarierte Variable wird verwendet" & wenn ich z.B. in der Main bin, dann kann ich ihm als parent ja nicht "Main" mitgeben. Wie würde dies denn dann funktionieren?
 

Bluray

Member
Wenn ich es mit CallSub2 aufrufe in Activity_Create führt es zu einem Fehler beim Debuggen:
(Das Code-Modul heißt bei mir AndroidScale)

Fehler:
B4A Version: 11.00
Parse den Code.    (0.02s)
    Java Version: 11
Building folders structure.    (0.02s)
Kompiliere den Code.    (0.05s)
Kompiliere Layoutcode.    (0.01s)
Kompiliere Debugger-Code    Error
B4A line: 33
CallSub2(AndroidScale,\
shell\src\b4a\example\main_subs_0.java:21: error: cannot find symbol
main.mostCurrent.__c.runMethodAndSync(false,"CallSubNew2",main.processBA,(Object)((main.mostCurrent._androidscale.getObject())),(Object)(BA.ObjectToString("SetActivityTypeface")),(Object)(main.getObject()));
                                                                                                                 ^
  symbol:   method getObject()
  location: variable _androidscale of type androidscale
1 error


Wenn ich es lediglich so in Activity_Create schreibe, kommt folgender Fehler:

1638265005195.png


und falls ich es mit AndroidScale.SetActivityTypeface(Me) aufrufen möchte, kommt folgender Fehler:

B4X:
B4A Version: 11.00
Parse den Code.    (0.03s)
    Java Version: 11
Building folders structure.    (0.01s)
Kompiliere den Code.    (0.06s)
Kompiliere Layoutcode.    (0.01s)
Organisiere Libraries.    (0.00s)
    (AndroidX SDK)
Ressourcen zusammenstellen    (0.09s)
Ressourcen verknüpfen    (0.27s)
Kompiliere Debugger-Code    (1.18s)
Kompiliere generierten Java Code.    Error
B4A line: 33
AndroidScale.SetActivityTypeface(Me)
src\b4a\example\main.java:413: error: incompatible types: Class<CAP#1> cannot be converted to BALayout
mostCurrent._androidscale._setactivitytypeface /*String*/ (mostCurrent.activityBA,(anywheresoftware.b4a.objects.ActivityWrapper) anywheresoftware.b4a.AbsObjectWrapper.ConvertToWrapper(new anywheresoftware.b4a.objects.ActivityWrapper(), (anywheresoftware.b4a.BALayout)(main.getObject())));
                                                                                                                                                                                                                                                                           ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?

In Process_Globals das Code-Modul zu deklarieren geht auf jeden Fall nicht (also z.B. sowas wie Private AS as AndroidScale)

Weist du was ich da falsch mache?
 
Last edited:
D

Deleted member 103

Guest
Wenn ich es mit CallSub2 aufrufe in Activity_Create führt es zu einem Fehler beim Debuggen:
(Das Code-Modul heißt bei mir AndroidScale)

Fehler:
B4A Version: 11.00
Parse den Code.    (0.02s)
    Java Version: 11
Building folders structure.    (0.02s)
Kompiliere den Code.    (0.05s)
Kompiliere Layoutcode.    (0.01s)
Kompiliere Debugger-Code    Error
B4A line: 33
CallSub2(AndroidScale,\
shell\src\b4a\example\main_subs_0.java:21: error: cannot find symbol
main.mostCurrent.__c.runMethodAndSync(false,"CallSubNew2",main.processBA,(Object)((main.mostCurrent._androidscale.getObject())),(Object)(BA.ObjectToString("SetActivityTypeface")),(Object)(main.getObject()));
                                                                                                                 ^
  symbol:   method getObject()
  location: variable _androidscale of type androidscale
1 error


Wenn ich es lediglich so in Activity_Create schreibe, kommt folgender Fehler:

View attachment 122469

und falls ich es mit AndroidScale.SetActivityTypeface(Me) aufrufen möchte, kommt folgender Fehler:

B4X:
B4A Version: 11.00
Parse den Code.    (0.03s)
    Java Version: 11
Building folders structure.    (0.01s)
Kompiliere den Code.    (0.06s)
Kompiliere Layoutcode.    (0.01s)
Organisiere Libraries.    (0.00s)
    (AndroidX SDK)
Ressourcen zusammenstellen    (0.09s)
Ressourcen verknüpfen    (0.27s)
Kompiliere Debugger-Code    (1.18s)
Kompiliere generierten Java Code.    Error
B4A line: 33
AndroidScale.SetActivityTypeface(Me)
src\b4a\example\main.java:413: error: incompatible types: Class<CAP#1> cannot be converted to BALayout
mostCurrent._androidscale._setactivitytypeface /*String*/ (mostCurrent.activityBA,(anywheresoftware.b4a.objects.ActivityWrapper) anywheresoftware.b4a.AbsObjectWrapper.ConvertToWrapper(new anywheresoftware.b4a.objects.ActivityWrapper(), (anywheresoftware.b4a.BALayout)(main.getObject())));
                                                                                                                                                                                                                                                                           ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?

In Process_Globals das Code-Modul zu deklarieren geht auf jeden Fall nicht (also z.B. sowas wie Private AS as AndroidScale)

Weist du was ich da falsch mache?
Lade bitte ein Beispiel-Projekt hoch und ich schaue es mir an.
 

so27

Active Member
Licensed User
Longtime User
Hallo peternmb,

ich stand auch schon vor dem gleiche Problem.
Mit diesem Code-Modul habe ich mein Problem gelöst. Damit wird in deine App die Schriftgröße immer auf normal gesetzt.

Das ist genial. Dankeschön!
 

so27

Active Member
Licensed User
Longtime User
Ah, habe das Problem gefunden.
B4X:
SetActivityTypeface(me) ' ist nicht korrekt

Es muss korrekt wie folgt lauten:
B4X:
SetActivityTypeface(Activity)
 
D

Deleted member 103

Guest
Ah, habe das Problem gefunden.
B4X:
SetActivityTypeface(me) ' ist nicht korrekt

Es muss korrekt wie folgt lauten:
B4X:
SetActivityTypeface(Activity)
Ja das stimmt, ich habe gerade ein Test-Projekt hochgeladen.
 

Attachments

  • B4x-Example.zip
    9.9 KB · Views: 187

Bluray

Member
Vielen Dank. Das funktioniert super.

Ich habe jedoch noch ein Problem. Ich habe ein TabStrip, in dem ich Layouts hinzufüge und auch wieder entferne. Sobald ich ein neues geöffnet habe, funktioniert das Skalieren nicht mehr, auch nicht wenn ich es in den Sub dazu schreibe.

B4X:
        TabPanel.RemoveView                      
        Activity.AddView(TabPanel,0,0,100%x,100%y)
        TabPanel.LoadLayout("1")
        TabStrip1.LoadLayout("2.bal","2")
        TabStrip1.LoadLayout("3.bal","3")
        TabStrip1.LoadLayout("4.bal","4")

Ich habe normalerweise nur ein Tabstrip mit Seite 2 und 3, hier füge ich (durch einen Button) nun die 4. Seite hinzu. Wenn ich dort "AndroidScale.SetActivityTypeface(Activity)" oder "AndroidScale.SetPanelTypeface(TabPanel)" hinzufüge, passiert nichts. Danach ist die Schriftgröße wieder wie in den Android Einstellungen.

Ich habe vorhin wie du gefragt hast ein Beispiel Projekt hochgeladen, jedoch ist dies noch nicht freigegeben.

Weißt du vielleicht wie man das beheben könnte?
 
D

Deleted member 103

Guest
Weißt du vielleicht wie man das beheben könnte?
Das passiert weil du noch lizenzierte User bist.
Lizenzierte User wirst nach dem Kauf einer B4i-Lizenz oder wenn eine Donation an "Anywhere Software" machst.
 
Top