【问题标题】:How to set text size using dimension from xml at runtime programmatically?如何在运行时以编程方式使用 xml 中的维度设置文本大小?
【发布时间】:2013-01-10 12:11:42
【问题描述】:

在dimens.xml中,我有:

<dimen name="text_medium">18sp</dimen>

在运行时,我得到这个值并设置文本视图的文本大小:

int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);
textView.setTextSize(size).

在 10 英寸平板电脑 (1280 x 800) 上,一切正常;但在手机 (800 x 480) 上,文本视图的字体非常大。在平板电脑上,大小等于 18;电话里是 27 岁。

如果我手动设置大小:

textView.setTextSize(size)

两个设备上的大小都是正常的。

【问题讨论】:

    标签: android textview dimensions


    【解决方案1】:

    dimens.xml中添加维度:

       <dimen name="text_medium">18sp</dimen>
    

    在代码中设置大小:

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

    【讨论】:

    • 我不知道 OP,但这是我正在寻找的答案。我使用 COMPLEX_UNIT_DP 认为我需要指定输入类型而不是输出类型。
    • 当我获得我的字体大小(在 sp 中定义)时,我得到了 60。当我用 OMPLEX_UNIT_PX 将其设置回来并再次检索时,我得到 70。似乎这里并非一切都清楚
    • 对于文本大小,为什么我不能使用TypedValue.COMPLEX_UNIT_SP 代替?
    • @dphans Resources.getDimension() 方法返回已经乘以适当度量的值
    • @pkuszewski 哇,太混乱了。
    【解决方案2】:

    getDimensionPixelSize() 和 getDimension() 方法都使用屏幕密度来计算像素。您的手机屏幕密度显然是 hdpi (240dpi),因此它使用 1.5 比例将 dp 转换为 sp。简单数学 18 * 1.5 = 27。

    您的平板电脑密度似乎是 mdpi (160dpi),因此比例仅为 1:1。

    但如果你比较两个文本的实际大小,它应该是相同的。

    最好的方法是创建两个 dimens.xml 文件,一个在 values 文件夹中用于手机,另一个在 values-sw600dp 中用于平板电脑(您也可以使用 values-sw720dp-land 文件夹来存储横向 10 英寸平板电脑的尺寸)。

    您可以阅读更多关于 Android 尺寸的信息:http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

    【讨论】:

      【解决方案3】:

      您可以使用 sdp(可缩放密度像素)https://github.com/intuit/sdp 代替 dp,这绝对可以挽救您的生命

      【讨论】:

        【解决方案4】:

        为了扩展 Kostek 波兰的答案,

        您的文本大小未按预期显示的原因是因为在这一行:

        int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);
        

        getDimensionPixelSize() 将“18sp”转换为像素大小,因此返回值与 18 不同。例如,该方法返回值 23。因此,当执行此行时:

        textView.setTextSize(size)
        

        该方法将您的文本大小设置为 23sp,因此您的文本大小会显得比预期的大。

        解决方案是在设置文本大小时改用这一行:

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

        这是有效的,因为第一个参数声明第二个参数是像素类型。所以现在如果第二个参数是 23,那么它不会被视为 23sp,而是表示 23 像素,相当于 18sp,但以像素为单位。

        【讨论】:

          猜你喜欢
          • 2013-10-30
          • 2019-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-17
          • 1970-01-01
          相关资源
          最近更新 更多