如何动态设置TextView在不同屏幕上的文本大小

151

我正在创建一个TextView并动态添加到布局中,我使用textView.setTextSize(18)方法来设置文本大小。我在三星平板上测试发现字体大小对于这个屏幕来说太小了,所以我将文本大小更改为25,但是对于模拟器(480*800)来说太大了。我的问题是如何动态设置文本大小,以适应所有屏幕。


8
但与重复的问题相比,这个问题标题已经很完美了。 - vnshetty
7个回答

304

编辑: 现在我在StackOverflow上搜索,我发现这个问题是重复的此问题这个问题

你需要使用另一个函数setTextSize(unit, size),其中单位为SP,像这样:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);

请阅读更多关于TypedValue常量的内容。


我认为你的回答不太好。最好使用dimens.xml中的值。 - Yura Shinkarev

168
你应该使用资源文件夹,例如
values-ldpi
values-mdpi
values-hdpi
在'dimensions.xml'文件中为每个范围编写文本大小。在Java代码中,您可以使用以下方式设置文本大小。
textView.setTextSize(getResources().getDimension(R.dimen.textsize));

示例dimensions.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textsize">15sp</dimen>
</resources>

你能给我一个编写dimensions.xml文件的例子吗? - Nishant
7
如果在sp中指定了尺寸,则可能不需要DPI限定词,因为它们会根据屏幕密度(和用户首选字体大小)进行缩放。 - Justin Mclean
DP不比SP更好吗?上述方法适用于这个问题吗:http://stackoverflow.com/questions/18497760/having-an-issue-with-textsize-within-textview - Si8
它也可以与 dimens.xml 一起使用。 - Pratik Butani
10
使用这种方法,文本大小看起来很大。 - zdd
39
实际上,您需要使用textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.textsize)); 来设置文本视图的字体大小。 - radu122

68
在这种情况下,可能没有必要使用ldpimdpihdpi限定符。
当您在资源文件中定义尺寸时,应该包含测量单位。如果使用sp作为单位,则根据屏幕密度进行缩放,因此15sp的文本应该在不同密度的屏幕上大致呈现相同大小。
(设备的真实屏幕密度不会完全匹配,因为Android将屏幕密度归纳为120、160、240、320、480和640 dpi组。)
调用getResources().getDimension(R.dimen.textsize)将返回以像素为单位的大小。如果使用sp,则将按屏幕密度进行缩放。
调用setText(float)将使用sp单位设置大小。这是其中的问题,即您一方面有像素的测量,另一方面有sp单位测量,修复此问题:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
    getResources().getDimension(R.dimen.textsize));

请注意你也可以使用

getResources().getDimensionPixelSize(R.dimen.textSize);

使用getDimension()的替代方法,并将其四舍五入并转换为非小数值。


50

经过长时间的卡壳,最终解决了这个问题,方法如下

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
              getResources().getDimension(R.dimen.textsize));

创建文件夹,类似于这样 res/values/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <dimen name="textsize">8sp</dimen>

 </resources>

6
为什么过去使用TypedValue.COMPLEX_UNIT_PX,现在要使用TypedValue.COMPLEX_UNIT_SP? (注:TypedValue.COMPLEX_UNIT_PX和TypedValue.COMPLEX_UNIT_SP都是Android开发中用来表示尺寸的常量,前者代表像素,后者代表缩放独立像素) - portfoliobuilder
我们需要在哪里创建dimen文件夹? - Sudarshan Taparia
@SudarshanTaparia 在这里创建文件夹 res/values/dimens.xml 并添加你的文本大小。 - NagarjunaReddy

4
在Style.xml中预定义样式:
<style name="largeText">
    <item name="android:textAppearance">@android:style/TextAppearance.Large.Inverse</item>
    <item name="android:textStyle">bold</item>
</style>

在代码中:
text.setTextAppearance(context, R.style.largeText);

你如何自定义largeText的尺寸测量? - IgorGanapolsky

-2
我认为您应该使用textView.setTextSize(float size)方法来设置文本的大小。textView.setText(arg)用于在文本视图中设置文本。

Android的文本大小将始终以sp为单位指定,而不是dp或浮点值。 - Jijo Thomas

-8
float currentSize = textEdit.getTextSize(); // default size
float newSize = currentSize * 2.0F; // new size is twice bigger than default one
textEdit.setTextSize(newSize);

我没有看到这个答案考虑屏幕尺寸的因素。 - Lay González
在我看来,这个问题是关于字体大小的。所以我不明白你为什么抱怨没有提到屏幕尺寸的参考资料。 默认字体在大多数情况下都有适当的大小。因此最好从默认大小的更大/更小的角度考虑字体大小,即与屏幕大小无关。因此,我编写了一个解决方案,可以用来相对于默认字体大小设置字体大小。 - trunikov

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