TextView - 以编程方式设置文本大小似乎无效

185

我正在使用Eclipse Indigo,测试2个模拟器(2.2和3.0)。

下面的代码显示了我正在测试的内容,然而设置文本大小无法在运行模拟器时在屏幕上显示任何内容。(如果我注释掉文本大小,文本会以红色显示)。我认为可能是Eclipse没有重新构建代码,但我添加了一行代码来添加蓝色背景,那就可以了。我已经尝试在设置文本后设置文本大小,但仍然没有成功。以下是代码。谢谢您的帮助! (免责声明)- 我正在尝试避免使用xml。由于我已经知道Java,所以不想依赖它。

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

public class TestAndroidvs2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView text = new TextView(this);
    text.setTextColor(Color.RED);
    text.setTextSize(2);    
    text.setBackgroundColor(Color.BLUE);
    text.setText("Hello Android");


    setContentView(text);
  }
}
9个回答

630

这个方法TextView.setTextSize(int unit , float size);需要两个参数。

尝试这样做:

text.setTextSize(TypedValue.COMPLEX_UNIT_SP,14);

请参考这里这里

更新: 现在setTextSize(float size)将以"scaled pixel"为单位自动设置文本大小,无需手动指定COMPLEX_UNIT_SP。请参考文档


43
这是正确的答案。更具体地说:float myTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18F, context.getResources().getDisplayMetrics()); - Brill Pappin

92

这对我解决了问题。我在所有设备上都得到了统一的字体大小。

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

R.dimen.font是统一的数字还是在不同设备上有不同的大小? - The_Martian
在我的情况下,我在 dimen.xml 文件中声明了字体,并在以下文件夹中设置了特定的值:values、values-sw600dp、values-sw720dp。 - Vikas
很奇怪的是,在调用textView.setTextSize(R.dimen.text_size_max)之后,TextView消失了。但使用您的方法就可以解决这个问题。 - Weiyi

33

目前,setTextSize(float size)方法可以良好地工作,因此我们不需要使用另一种方法来改变文本大小。

android.widget.TextView.java源代码

/**
 * Set the default text size to the given value, interpreted as "scaled
 * pixel" units.  This size is adjusted based on the current density and
 * user font size preference.
 *
 * <p>Note: if this TextView has the auto-size feature enabled than this function is no-op.
 *
 * @param size The scaled pixel size.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
@android.view.RemotableViewMethod
public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

使用示例

textView.setTextSize(20); // set your text size = 20sp

AOSP TextView源代码链接:https://github.com/aosp-mirror/platform_frameworks_base/blob/37ee696d849361090a091c8fe8fad10537dabbba/core/java/android/widget/TextView.java#L4244-L4304 - Albert Vila Calvo

21

字号为2的文本几乎是看不见的。请至少使用14号字体。顺便说一下,使用XML有很多优点,一旦你需要做比“Hello World”更复杂的事情,它会让你的生活变得更加容易。


我会尝试使用14。正如我在第一篇帖子中所说 - 即使2太小了,那也不应该使我的屏幕变空白,对吧?我想我把它读成了超出文本已有的比例,而不是简单地设置大小。 - 我会查看,但我还是要问 - 默认大小是多少?无论如何,谢谢。 - cspam
顺便说一下 - 是的,我意识到XML可能有其优点,但我没有任何经验。是的,我知道学习它可能很容易。由于我已经熟悉Java,所以我认为尽可能熟悉许多类将非常有用。使用XML似乎会将其中很多内容隐藏起来。 - cspam
1
它不会隐藏它 - 它是具有相同参数的相同类。需要一些时间才能在两者之间进行翻译,但实际上非常高效。作为奖励,如果您在XML中定义视图,则系统会处理不同的屏幕大小、密度和方向,无需更改代码,只需更改布局文件即可。 - Nikolay Elenkov
您是否能够根据任意数量的因素在运行时更改布局和方向? - cspam
这是一个非常广泛的问题,但简而言之,是的。即使您在XML中定义了UI,仍然可以在运行时添加/删除视图。您还可以覆盖默认行为并自己处理方向更改。 - Nikolay Elenkov

12

在我的情况下,我使用了这个方法

public static float pxFromDp(float dp, Context mContext) {
    return dp * mContext.getResources().getDisplayMetrics().density;
}

在此设置TextView的文本大小

textView.setTextSize(pxFromDp(18, YourActivity.this));

继续享受 :)


嗨,@Dhruv Raval,我正在学习如何在我的项目中调整字体大小,如果这个值18对于任何屏幕密度都有效,还是应该为每个屏幕创建一个维度? - Armando Marques da S Sobrinho

11
请参见此链接以了解有关在代码中设置文本大小的更多信息。基本上它说:

public void setTextSize(int unit, float size)

自:API Level 1 将默认文本大小设置为给定单位和值。有关可能的维度单位,请参见TypedValue。相关XML属性

android:textSize 参数

unit 所需的尺寸单位。
size 给定单位中所需的尺寸。


(注:已翻译HTML标签内的内容,保留标签不进行翻译)

1
我刚在Eclipse中检查了一下我的代码,并根据智能感知,实际上有两个选项可以使用setTextSize,即setTextSize(float size)和setTextSize(int unit, float size)。您提供的文档证实了这一点。 - cspam
对了,你试过了吗? Nikolay 说2太小了,增加一下试试看。 - Jack
是的,但问题在于,当我尝试按照现在的方式操作时,文本甚至没有显示出来。屏幕是空白的,即使2不明显,为什么屏幕会是空白的呢? - cspam
不是空白的。如果你仔细看,你可以看到小红色像素:)。逐渐增加大小以查看。 - Nikolay Elenkov
顺便提一下,setTextSize(float) 等同于 setTextSize(COMPLEX_UNIT_SP, float)。 - Nikolay Elenkov
是的,就像我之前说的那样,我把setText想象成了一个刻度,所以这是我的错。这有点傻,不是吗? :) - cspam

4
在 Kotlin 中,你可以像这样简单地使用:
``` textview.textSize = 20f ```

0

对我来说,直到我禁用了自动文本大小调整,一切才开始正常工作:

if (Build.VERSION.SDK_INT >= 26) {
    textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE)
}
setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeInSp)

0

您可以使用setTextSize方法来设置文本大小。

TextView.setTextsize(12);

2
setTextSize需要浮点数而不是整数。 - Malik Saifullah

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