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

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


当前回答

像使用字符串资源(DOCS)一样使用资源的维度类型。

在你的dimension .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"/>

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

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

其他回答

这可能会有所帮助。将代码添加到您的自定义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;
}

然而,Resource#updateConfiguration是在API级别25中部署的,这意味着在未来的某一天它将不受支持。

最简单的方法就是使用如下代码:

android:textSize="32sp"

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

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

在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

将DP更改为sp,这是android的良好实践 android: textSize = " 18 sp "