Die Schriftgröße von TextView in der Android-Anwendung ändert sich, wenn die Schriftgröße in den nativen Einstellungen geändert wird

171

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.

Vikasdeep Singh
quelle
2
Wenn Sie die Schriftgröße der nativen Schriftart Ihres Geräts ändern, wirkt sich dies standardmäßig auch auf die Schriftgröße Ihrer Anwendung aus.
Shreyash Mahajan
Sie können Antwort von hier finden stackoverflow.com/questions/16706076/…
Bhavesh Jethani
Verwenden Sie sp für die Textgröße… weil es jedoch durch die bevorzugte Schriftgröße des Benutzers skaliert wird. Verwenden Sie dp für alles andere.
Live-Liebe

Antworten:

229

Tatsächlich wirkt sich die Schriftgröße der Einstellungen nur auf die Größe in aus sp. Alles, was Sie tun müssen - definieren textSizein dpstatt 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 dpanstelle von spfür Text kann dazu führen, dass einige Benutzer Ihrer App unfreiwillig diskriminiert werden.

dh:

android:textSize="32dp"
Sandstar
quelle
12
Vor langer Zeit wollte ich wissen, ob es eine Regel gibt, wann spund wann ich verwenden sollte dp. Ich habe hier eine wirklich gute Antwort bekommen: stackoverflow.com/questions/11638691/…
Sam
129

Am einfachsten ist es, einfach Folgendes zu verwenden:

android:textSize="32sp"

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

Evan Long
quelle
1
Dies ist eigentlich der Grund, warum der TS das Problem hat, 'sp' anstelle von 'dp' zu verwenden
Boy
8
Ich weiß immer noch nicht, warum es 100 Upvotes gibt. denn wenn wir sp für die eingestellte Textgröße in der Anwendung verwenden. Dann ändern wir die Schriftgröße in Einstellung, die Textansicht in der Anwendung ändert sich auch
Phan Van Linh
Wie beantwortet dies die Frage?
Siddarth G
48

Verwenden Sie den dimensionRessourcentyp so, wie Sie stringRessourcen ( DOCS ) verwenden.

dimens.xmlDeklarieren 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.xmlDateien 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.

Ashakirov
quelle
1
Problem ist nicht Bildschirme. Es ist die native Schriftgröße, die in den Android-Anzeigeeinstellungen ausgewählt wurde und zu dem genannten Problem führt
Himanshu Virmani
24

Beachten Sie auch, dass beim Aufrufen von textSize im Code beim Aufrufen textView.setTextSize(X)die Nummer (X) als SP interpretiert wird. Verwenden Sie setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)diese Option , um Werte in dp festzulegen .

Arpit
quelle
13

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.

mba
quelle
6

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());
}
Usama Saeed US
quelle
1

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.

Arno_J
quelle
1

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.

Hossein Karami
quelle
1

Für Kotlin funktioniert es bei mir

priceTextView.textSize = 12f
Shihab Uddin
quelle
1

ändere den DP auf sp es ist eine gute Übung für Android android: textSize = "18sp"

Sanjay
quelle
0

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).

Maxim Saplin
quelle
0

getResources()Aktivität überschreiben .

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

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

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

Quelle https://stackoverflow.com/a/57225687/7985871

Emad Pirayesh
quelle