194

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

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

4

15 回答 15

257

实际上,设置字体大小仅影响sp. 因此,您需要做的所有事情 - 定义textSizeindp而不是sp,然后设置不会更改您应用中的文本大小。

这是文档的链接:尺寸

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

IE:

android:textSize="32dp"
于 2012-11-07T07:22:22.550 回答
131

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

android:textSize="32sp"

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

于 2013-08-24T12:38:48.253 回答
52

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

于 2012-11-07T07:27:58.230 回答
25

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

于 2013-05-08T02:10:52.887 回答
15

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

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

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

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

于 2014-12-10T11:02:23.007 回答
9

防止整个应用程序受到系统字体大小影响的简单方法是使用基本活动更新配置。

//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());
}
于 2018-04-07T18:02:11.360 回答
2

您可以使用以下代码:

android:textSize="32dp"

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

https://stacklearn.ir

于 2019-02-26T16:53:54.557 回答
2

此解决方案与 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 进行了更新

于 2020-07-29T19:39:40.177 回答
1

这可能会有所帮助。在您的自定义应用程序或 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;
}

但是,Resource#updateConfiguration 在 API 级别 25 中被取消,这意味着将来有一天它会不受支持。

于 2018-03-23T02:48:35.460 回答
1

对于 kotlin,它对我有用

priceTextView.textSize = 12f
于 2020-03-12T09:25:56.640 回答
1

将 DP 更改为 sp 它是 android android:textSize="18sp" 的好习惯

于 2020-03-17T13:16:25.567 回答
1

在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

于 2020-04-11T10:44:05.803 回答
0

如果使用的单位是 SP,而不是 DP,并且您想要覆盖系统字体缩放,您所做的就是覆盖活动中的一种方法 -请参阅这篇文章

resources.updateConfiguration已弃用且有问题(在 Oreo 上,我遇到了格式化文本的问题)。

于 2018-12-29T14:18:22.330 回答
0

getResources()在活动中覆盖。

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

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}
于 2019-05-10T10:34:11.960 回答
0

我通常从资源文件中的维度更改大小

<resources>
    <dimen name="siez_1">40px</dimen>
    <dimen name="siez_2">50px</dimen>
    <dimen name="siez_3">60px</dimen>

</resources>
于 2021-05-17T04:41:50.580 回答