如何为不同的屏幕动态设置textview的文本大小

Nis*_*ant 137 android

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

MKJ*_*ekh 270

编辑:当我在StackOverflow上搜索时,我发现此问题重复:

你需要使用另一个功能setTextSize(unit, size),SP像这样,

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);
Run Code Online (Sandbox Code Playgroud)

请阅读更多TypedValue常量.

  • 只有这种方式适合我,其他方法都使文字变得非常大! (6认同)

ble*_*enm 160

您应该使用资源文件夹,例如

values-ldpi
values-mdpi
values-hdpi
Run Code Online (Sandbox Code Playgroud)

并在'dimensions.xml'文件中为每个范围写入文本大小.

在java代码中,您可以使用设置文本大小

textView.setTextSize(getResources().getDimension(R.dimen.textsize));
Run Code Online (Sandbox Code Playgroud)

示例dimensions.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textsize">15sp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你需要textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimension(R.dimen.textsize)); (30认同)
  • 使用此方法,文本大小看起来非常大. (8认同)
  • 如果在sp中指定维度,则可能不需要DPI限定符,因为它们是按屏幕密度(和用户首选字体大小)缩放的. (7认同)

Jus*_*ean 66

在这种情况下ldpi,可能不需要使用mdpihdpi限定符.

在资源文件中定义维时,包括测量单位.如果使用sp单位,则根据屏幕密度进行缩放,因此15sp处的文本在不同密度的屏幕上应显示大致相同的大小.
(设备的实际屏幕密度不会完全匹配,因为Android会将屏幕密度120, 160, 240, 320, 480 and 640 dpi分组.)

调用getResources().getDimension(R.dimen.textsize)它时将返回以像素为单位的大小.如果使用sp,它将按屏幕密度缩放,

调用setText(float)设置大小sp units.这就是问题所在,
你一方面有像素测量,另一方面sp unit要修复这样做:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
    getResources().getDimension(R.dimen.textsize));
Run Code Online (Sandbox Code Playgroud)

注意你也可以使用

getResources().getDimensionPixelSize(R.dimen.textSize);
Run Code Online (Sandbox Code Playgroud)

而不是,getDimension()它将舍入并转换为非小数值.


Nag*_*ddy 41

经过很长时间的打击,终于解决了这个问题

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
              getResources().getDimension(R.dimen.textsize));
Run Code Online (Sandbox Code Playgroud)

res/values/dimens.xml像这样创建文件夹res/values/dimens.xml

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

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

 </resources>
Run Code Online (Sandbox Code Playgroud)

  • 为什么TypedValue.COMPLEX_UNIT_PX和现在的TypedValue.COMPLEX_UNIT_SP? (6认同)