从本机设置更改字体大小后,Android应用程序中TextView的字体大小也会更改


171

我想在应用程序中指定自己的文本大小,但是这样做有问题。

当我在设备设置中TextView更改字体大小时,我的应用程序的字体大小也会更改。


2
默认行为是,如果您更改设备本机字体的字体大小,那么它也会影响您的应用程序字体大小。
Shreyash Mahajan


使用sp作为文本大小…,因为它是根据用户的字体大小首选项进行缩放的。将dp用于其他所有内容。
真爱

Answers:


231

实际上,“设置”字体大小仅影响中的大小sp。因此,您所需要做的就是-定义为textSizedp而不是sp,设置不会更改应用程序中的文本大小。

这是文档的链接:尺寸

但是,请注意,预期的行为是所有应用程序中的字体都尊重用户的首选项。用户可能要调整字体大小的原因有很多,其中一些甚至可能是医学上的—视障用户。使用dp而不是sp文字可能会导致不情愿地歧视您的某些应用程序用户。

即:

android:textSize="32dp"

12
很久以前,我想知道是否有关于何时使用sp和何时使用的规则dp。我有一个很好的响应位置:stackoverflow.com/questions/11638691/...
萨姆

129

最简单的方法就是使用如下所示的内容:

android:textSize="32sp"

如果您想进一步了解该textSize属性,可以查看Android开发者文档


1
这实际上就是TS出现问题的原因,使用“ sp”而不是“ dp”
2015年

8
我仍然不知道为什么会有100个投票。因为如果我们在应用程序中使用sp来设置textsize。然后,我们在设置中更改字体大小,应用程序中的TextView也将更改
Phan Van Linh

这如何回答这个问题?
Siddarth G

48

使用dimension资源的类型就像使用string资源(DOCS)一样。

dimens.xml文件中,声明尺寸变量:

<?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>

然后,您可以像下面这样使用这些值:

<TextView
   android:layout_height="@dimen/textview_height"
   android:layout_width="@dimen/textview_width"
   android:textSize="@dimen/font_size"/>

您可以dimens.xml为不同类型的屏幕声明不同的文件。这样做可以确保您的应用程序在不同设备上的理想外观。

不指定时android:textSize,系统使用默认值。


1
问题不是屏幕。这是在Android显示设置中选择的本机字体大小,导致出现上述问题
Himanshu Virmani 2013年

24

还要注意,如果在代码中设置了textSize,则调用textView.setTextSize(X)会将数字(X)解释为SP。用于setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)dp中设置值。


13

如果已经在dimen.xml文件中定义了代码,则必须再次通过代码指定DIP或SP并不是一件好事。

我认为最好的选择是在使用dimen.xml值时使用PX:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));

这样,您可以在dimen.xml文件中根据需要从DP切换到SP,而无需更改任何代码。


6

防止整个应用程序受系统字体大小影响的一种简单方法是使用基本活动进行updateConfiguration。

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

1

这可能会有所帮助。在您的自定义Application或BaseActivity中添加代码

/**
 * 重写 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;
}

但是,在API级别25中复制了Resource#updateConfiguration,这意味着将来某天将不支持该资源。


1

您可以使用以下代码:

android:textSize="32dp"

它可以解决您的问题,但您必须知道应该尊重用户的决定。这样,从设备设置更改文本大小不会更改此值。所以这就是为什么您需要使用sp而不是dp的原因。因此,我的建议是使用不同的系统字体大小(小,标准,大,...)查看您的应用



1

将DP更改为sp对于Android来说是一个很好的选择android:textSize =“ 18sp”



0

覆盖getResources()活动。

像往常一样在sp中设置TextView的大小,例如 android:textSize="32sp"

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

0

在android 8这个解决方案为我工作

在基本活动中添加此代码

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    final Configuration override = new Configuration(newBase.getResources().getConfiguration());
    override.fontScale = 1.0f;
    applyOverrideConfiguration(override);
}

来源 https://stackoverflow.com/a/57225687/7985871

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.