Font size of TextView in Android application chang

2019-01-16 04:30发布

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.

10条回答
迷人小祖宗
2楼-- · 2019-01-16 04:37

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.

查看更多
萌系小妹纸
3楼-- · 2019-01-16 04:38

simple way to prevent the whole app from getting effected by system font size is to updateConfiguration using a base activity.

//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());
}
查看更多
【Aperson】
4楼-- · 2019-01-16 04:44

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"
查看更多
姐就是有狂的资本
5楼-- · 2019-01-16 04:46

Using font size in DPs instead of SPs in textSize solves this.

查看更多
Deceive 欺骗
6楼-- · 2019-01-16 04:50

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.

查看更多
何必那么认真
7楼-- · 2019-01-16 04:51

If units used are SP, not DP, and you want to override system font scaling, all you do is override one method in activity - see this post.

resources.updateConfiguration is deprecated and buggy (on Oreo I had issues with formatted text).

查看更多
登录 后发表回答