In Android ist die Ressource Konfiguration vor, welche Ressourcen und Assets ausgewählt werden. Das System gibt eine Standardkonfiguration vor, die zu Ihrem Gerät und Ihren Einstellungen (Bildschirmgröße, Geräteausrichtung, Sprache) passt. Manchmal müssen Sie von diesen Standardeinstellungen abweichen. Seit API 17 können Sie mit applyOverrideConfiguration(Konfiguration) verwenden, um eine alternative Ressourcenkonfiguration anzugeben. Normalerweise tun Sie dies in der Methode attachBaseContext(Context) Ihrer Activity.
[code language="java"] public class MainActivity extends Activity { @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); final Konfiguration override = new Konfiguration(); override.locale = new Locale("nl", "NL"); applyOverrideConfiguration(override); } // }. [/code]So sieht das aus:
![]() |
![]() |
Leider gibt es einen Haken.
Android verfügt über eine Einstellung "Großer Text" in den Eingabehilfen (und in einigen Fällen über eine andere Textgrößeneinstellung in den Anzeigeoptionen). Wenn Sie die Methode overrideConfiguration verwenden, um Ihre eigene Ressourcenkonfiguration festzulegen, löschen Sie die Einstellung "Großer Text" und beeinträchtigen damit die Unterstützung der Barrierefreiheit. Dieses Problem ist leicht zu übersehen und glücklicherweise leicht zu beheben.
![]() | ![]() |
Die Einstellung für große Schriftarten funktioniert durch Änderung des Attributs Configuration.fontScale, das ein öffentlicher Float ist. Dies funktioniert mit den skalierten dichteunabhängigen Pixeln(sp's), die Sie zur Definition von fontSize-Attributen verwenden. Auf alle sp-Dimensionen wird dieser fontScale-Multiplikator angewendet. Mein Nexus 5 hat zwei Schriftgrößeneinstellungen, normal mit 1,0 und groß mit 1,3. Das Bild des Nexus 5-Emulators hat vier, und viele Samsung-Geräte haben sieben verschiedene Schriftgrößen, aus denen Sie wählen können.
Wenn Sie die Überschreibungskonfiguration festlegen, wird die fontScale des neuen Konfigurationsobjekts auf 1.0f gesetzt, wodurch der Modus für große Schriftarten unterbrochen wird. Um dieses Problem zu beheben, müssen Sie einfach den aktuellen
[code language="java"] public class MainActivity extends Activity { @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); final Configuration override = new Configuration( // Kopieren Sie die ursprüngliche Konfiguration, damit sie nicht verloren geht. newBase.getResources().getConfiguration() ); override.locale = new Locale("nl", "NL"); applyOverrideConfiguration(override); // BTW: Sie können auch über Settings.System auf den fontScale-Wert zugreifen: // Settings.System.getFloat(getContentResolver(), Settings.System.FONT_SCALE, 1.0f); } //... } [/code]
Die App funktioniert jetzt wie vorgesehen, mit intakter Unterstützung für Barrierefreiheit.

Lange Rede, kurzer Sinn: Wenn Sie applyOverrideConfiguration verwenden, testen Sie Ihre Anwendung immer mit der Einstellung für große Schriftarten. Stellen Sie sicher, dass Sie die ursprüngliche Konfiguration in Ihren neuen Konfigurationskonstruktor kopieren oder verwenden Sie die Eigenschaft System.Settings.FONT_SCALE, um den Schriftgrad separat abzurufen.
Verfasst von

Barend Garvelink
Contact







