web-dev-qa-db-de.com

Die Schriftgröße von TextView in der Android-Anwendung ändert sich beim Ändern der Schriftgröße von den nativen Einstellungen

Ich möchte meine eigene Textgröße in meiner Anwendung angeben, aber ich habe ein Problem damit. 

Wenn ich die Schriftgröße in den Geräteeinstellungen ändere, ändert sich auch die Schriftgröße meiner Anwendung TextView.

140
VicJordan

Die Schriftgröße für Einstellungen wirkt sich nur auf Größen in sp aus. Sie müssen also nur textSize in dp statt sp definieren. In diesem Fall wird die Textgröße in Ihrer App nicht geändert.

Hier ist ein Link zur Dokumentation: Abmessungen

Beachten Sie jedoch, dass das erwartete Verhalten darin besteht, dass die Zeichensätze in allen Apps die Präferenzen des Benutzers berücksichtigen. Es gibt viele Gründe, warum ein Benutzer die Schriftgröße anpassen möchte, und einige davon können sogar medizinisch - sehbehinderte Benutzer sein. Die Verwendung von dp anstelle von sp für Text kann dazu führen, dass einige Benutzer Ihrer App unwillkürlich diskriminiert werden.

das heißt: 

Android:textSize="32dp"
192
sandrstar

Am einfachsten ist es, etwas wie das Folgende zu verwenden:

Android:textSize="32sp"

Wenn Sie mehr über die textSize-Eigenschaft erfahren möchten, können Sie die Android-Entwicklerdokumentation überprüfen.

127
Evan Long

Verwenden Sie den Ressourcentyp dimension wie string-Ressourcen ( DOCS ).

Deklarieren Sie in Ihrer dimens.xml-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 Arten von Bildschirmen deklarieren . Dadurch wird das gewünschte Aussehen Ihrer App auf verschiedenen Geräten garantiert.

Wenn Sie nicht Android:textSize angeben, verwendet das System die Standardwerte.

43
ashakirov

Beachten Sie auch, dass bei Aufruf von textSize im Code der Aufruf von textView.setTextSize(X) die Nummer (X) als SP interpretiert. Verwenden Sie setTextSize(TypedValue.COMPLEX_UNIT_DIP, X), um Werte in dp festzulegen. 

23
Arpit

Es ist nicht ratsam, DIP oder SP erneut durch Code anzugeben, wenn dies bereits in einer Datei dimen.xml definiert ist.

Ich denke, dass die beste Option die Verwendung von PX ist, wenn Sie einen dimen.xml-Wert verwenden:

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.

12
mba

um zu verhindern, dass die gesamte App von der Systemschriftgröße beeinflusst wird, kann updateConfiguration mithilfe einer Basisaktivität verwendet werden.

//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());
}
4
Usama Saeed US

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;
}

die Ressource # UpdateKonfiguration ist jedoch in API Level 25 erschöpft, was bedeutet, dass sie irgendwann in der Zukunft nicht mehr unterstützt wird. 

1
Arno_J

Die Verwendung der Schriftgröße in DPs anstelle von SPs in textSize löst dieses Problem.

1
bpr10

Sie müssen in TextView-Tags in XML schreiben:

Android:textSize="32dp"
1
neha

getResources() in Activity überschreiben.

Stellen Sie die Größe von TextView wie gewohnt in sp wie Android:textSize="32sp" ein

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}
0
jay

Wenn als Einheiten SP und nicht DP verwendet wird und Sie die Skalierung der Systemschriftart überschreiben möchten, müssen Sie nur eine Methode in Activity überschreiben - siehe diesen Beitrag .

resources.updateConfiguration ist veraltet und fehlerhaft (bei Oreo hatte ich Probleme mit formatiertem Text).

0
Maxim Saplin

Sie können diesen Code verwenden:

Android:textSize="32dp"

es löst Ihr Problem, aber Sie müssen wissen, dass Sie die Benutzerentscheidungen berücksichtigen sollten. Durch Ändern der Textgröße in den Geräteeinstellungen wird dieser Wert nicht geändert. Aus diesem Grund müssen Sie sp anstelle von dp ..__ verwenden. Mein Vorschlag ist daher, Ihre App mit verschiedenen Systemschriftgrößen zu überprüfen (klein, normal, groß, ...)

0
Hossein Karami