Ich möchte meine eigene Textgröße in meiner Anwendung angeben, habe jedoch ein Problem damit.
Wenn ich die Schriftgröße in den Geräteeinstellungen ändere, ändert sich auch die Schriftgröße meiner Anwendung TextView
.
Ich möchte meine eigene Textgröße in meiner Anwendung angeben, habe jedoch ein Problem damit.
Wenn ich die Schriftgröße in den Geräteeinstellungen ändere, ändert sich auch die Schriftgröße meiner Anwendung TextView
.
Antworten:
Tatsächlich wirkt sich die Schriftgröße der Einstellungen nur auf die Größe in aus sp
. Alles, was Sie tun müssen - definieren textSize
in dp
statt sp
, dann ändern die Einstellungen die Textgröße in Ihrer App nicht.
Hier ist ein Link zur Dokumentation: Abmessungen
Beachten Sie jedoch, dass das erwartete Verhalten darin besteht, dass die Schriftarten in allen Apps die Einstellungen des Benutzers berücksichtigen. Es gibt viele Gründe, warum ein Benutzer die Schriftgröße anpassen möchte, und einige von ihnen sind möglicherweise sogar medizinisch - sehbehinderte Benutzer. Die Verwendung dp
anstelle von sp
für Text kann dazu führen, dass einige Benutzer Ihrer App unfreiwillig diskriminiert werden.
dh:
android:textSize="32dp"
sp
und wann ich verwenden sollte dp
. Ich habe hier eine wirklich gute Antwort bekommen: stackoverflow.com/questions/11638691/…
Am einfachsten ist es, einfach Folgendes zu verwenden:
android:textSize="32sp"
Wenn Sie mehr über die textSize
Eigenschaft erfahren möchten, können Sie die Android-Entwicklerdokumentation überprüfen .
Verwenden Sie den dimension
Ressourcentyp so, wie Sie string
Ressourcen ( DOCS ) verwenden.
dimens.xml
Deklarieren Sie in Ihrer Datei Ihre Dimensionsvariablen:
<?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>
Dann können Sie diese Werte wie folgt verwenden:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
Sie können verschiedene dimens.xml
Dateien für verschiedene Bildschirmtypen deklarieren . Auf diese Weise wird das gewünschte Aussehen Ihrer App auf verschiedenen Geräten garantiert.
Wenn Sie nicht angeben android:textSize
, verwendet das System die Standardwerte.
Es ist nicht gut, DIP oder SP erneut per Code angeben zu müssen, wenn dies bereits in einer Datei dimen.xml definiert ist.
Ich denke, dass die beste Option darin besteht, PX zu verwenden, wenn ein dimen.xml-Wert verwendet wird:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
Auf diese Weise können Sie bei Bedarf in der Datei dimen.xml von DP zu SP wechseln, ohne Code ändern zu müssen.
Eine einfache Möglichkeit, zu verhindern, dass die gesamte App von der Systemschriftgröße beeinflusst wird, besteht darin, die Konfiguration mithilfe einer Basisaktivität zu aktualisieren.
//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());
}
das kann helfen. Fügen Sie den Code in Ihre benutzerdefinierte Anwendung oder BaseActivity ein
/**
* 重写 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;
}
Resource # updateConfiguration ist jedoch in API-Level 25 erschöpft, was bedeutet, dass es eines Tages in Zukunft nicht mehr unterstützt wird.
Sie können diesen Code verwenden:
android:textSize="32dp"
Es löst Ihr Problem, aber Sie müssen wissen, dass Sie Benutzerentscheidungen respektieren sollten. Durch Ändern der Textgröße in den Geräteeinstellungen wird dieser Wert nicht geändert. Deshalb müssen Sie sp anstelle von dp verwenden . Mein Vorschlag ist daher, Ihre App mit verschiedenen Systemschriftgrößen (klein, normal, groß, ...) zu überprüfen.
Für Kotlin funktioniert es bei mir
priceTextView.textSize = 12f
Wenn die verwendeten Einheiten SP und nicht DP sind und Sie die Skalierung von Systemschriftarten überschreiben möchten, müssen Sie nur eine Methode in der Aktivität überschreiben - siehe diesen Beitrag .
resources.updateConfiguration ist veraltet und fehlerhaft (auf Oreo hatte ich Probleme mit formatiertem Text).
In Android 8 funktioniert diese Lösung für mich
Fügen Sie diesen Code in die Basisaktivität ein
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
final Configuration override = new Configuration(newBase.getResources().getConfiguration());
override.fontScale = 1.0f;
applyOverrideConfiguration(override);
}