Font size of TextView in Android application changes on changing font size from native settings
I want to specify my own text size in my application, but I am having a problem doing this.
When I change the font size in the device settings, the font size of my application TextView
also changes.
Solution 1:
Actually, Settings font size affects only sizes in sp
. So all You need to do - define textSize
in dp
instead of sp
, then settings won't change text size in Your app.
Here's a link to the documentation: Dimensions
However please note that the expected behavior is that the fonts in all apps respect the user's preferences. There are many reasons a user might want to adjust the font sizes and some of them might even be medical - visually impaired users. Using dp
instead of sp
for text might lead to unwillingly discriminating against some of your app's users.
i.e:
android:textSize="32dp"
Solution 2:
The easiest to do so is simply to use something like the following:
android:textSize="32sp"
If you'd like to know more about the textSize
property, you can check the Android developer documentation.
Solution 3:
Use the dimension
type of resources like you use string
resources (DOCS).
In your dimens.xml
file, declare your dimension variables:
<?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>
Then you can use these values like this:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
You can declare different dimens.xml
files for different types of screens.
Doing this will guarantee the desired look of your app on different devices.
When you don't specify android:textSize
the system uses the default values.
Solution 4:
Also note that if the textSize is set in code, calling textView.setTextSize(X)
interprets the number (X) as SP. Use setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
to set values in dp.
Solution 5:
It is not a good thing to have to specify DIP or SP again by code when already defined in a dimen.xml file.
I think that the best option is to use PX when using a dimen.xml value :
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
This way, you can switch from DP to SP if needed in dimen.xml file without having to change any code.