在Android应用中,TextView的字体大小会随着原生设置中字体大小的改变而改变。

213

我希望在我的应用程序中指定自己的文本大小,但我在这方面遇到了问题。

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


3
默认情况下,如果您更改设备本地字体的字体大小,则会影响应用程序的字体大小。 - Shreyash Mahajan
你可以在这里找到答案:https://dev59.com/K2Qn5IYBdhLWcg3wmILY#16910589 - Bhavesh Jethani
使用sp来设置文本大小...因为它会根据用户的字体大小偏好进行缩放。对于其他所有内容,请使用dp。 - live-love
15个回答

281
实际上,设置字体大小只影响sp中的大小。所以您需要做的就是将textSize定义为dp,而不是sp,这样设置就不会改变您应用中的文本大小。
这是文档链接:Dimensions
但请注意,期望行为是所有应用程序中的字体都遵循用户的偏好设置。有许多原因可以调整字体大小,其中一些甚至可能是医疗原因-视力受损的用户。对于文本,使用dp而不是sp可能会导致您的应用程序无意中歧视某些用户。
android:textSize="32dp"

14
很久之前,我想知道何时应该使用“sp”和何时应该使用“dp”的规则。我在这里得到了一个非常好的回答:https://dev59.com/RWgu5IYBdhLWcg3wByq1 - Sam

135

最简单的方法就是直接使用以下内容:

android:textSize="32sp"

如果您想了解更多关于textSize属性的信息,可以查看Android开发者文档


1
这就是 TS 出现问题的原因,使用了 'sp' 而不是 'dp'。 - Boy
11
我仍然不知道为什么有100个赞。因为如果我们在应用中使用sp来设置文本大小。当我们在设置中更改字体大小时,应用程序中的TextView也会随之更改。 - Linh
这个回答如何解答这个问题? - Siddarth G
如果你想要文本在不同的屏幕尺寸下保持一致,你应该使用dp。 - Mubarak Tahir

55

像使用string资源一样使用dimension类型的资源(文档)。

在你的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时,系统使用默认值。

2
问题不在于屏幕,而是在Android显示设置中选择的本地字体大小导致了所提到的问题。 - Himanshu Virmani

29

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


15

当在dimen.xml文件中定义了DIP或SP时,在代码中再次指定这些值并不是一件好事。

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

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

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


12

通过使用基础活动并更新配置(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());
}

5
您可以使用以下代码:
android:textSize="32dp"

IT技术可以解决你的问题,但你必须尊重用户的决定。因此,从设备设置更改文本大小不会改变该值。这就是为什么你需要使用 sp 而不是 dp 的原因。

因此,我的建议是使用不同的系统字体大小(小号、正常、大号等)来审查你的应用程序。

https://stacklearn.ir


4

这个解决方案使用 Kotlin 编写,并且没有使用过时的函数 resources.updateConfiguration。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        adjustFontScale(resources.configuration)
    }

    private fun adjustFontScale(configuration: Configuration?) {
        configuration?.let {
            it.fontScale = 1.0F
            val metrics: DisplayMetrics = resources.displayMetrics
            val wm: WindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
            wm.defaultDisplay.getMetrics(metrics)
            metrics.scaledDensity = configuration.fontScale * metrics.density

            baseContext.applicationContext.createConfigurationContext(it)
            baseContext.resources.displayMetrics.setTo(metrics)

        }
    }

观察:这是与上述相同的解决方案,但已更新为Kotlin


1
对于 Kotlin,它对我有效。
priceTextView.textSize = 12f

1
这可能会有所帮助。将代码添加到您的自定义应用程序或基础活动中。
/**
 * 重写 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功能,这意味着它在未来某一天将不再受支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接