【问题标题】:TextView.setTextSize behaves abnormally - How to set text size of textview dynamically for different screensTextView.setTextSize 行为异常 - 如何为不同屏幕动态设置 textview 的文本大小
【发布时间】:2011-04-10 20:47:19
【问题描述】:

呼叫TextView.setTextSize() 工作异常。在调用setTextSize 之后,如果我们得到getTextSize,它返回的值比我们之前设置的值要高得多。

这是我们正在做的事情:

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

有人见过吗?

【问题讨论】:

  • 您正在获取和设置两个不同对象的文本大小?

标签: android textview


【解决方案1】:

Kotlin 解决方案

要使用资源进行设置,只需使用以下代码:

textView.setTextSize(COMPLEX_UNIT_PX, textView.resources.getDimension(R.dimen.my_text_size))

要对资源值执行相同操作,请添加此扩展属性以更轻松地设置文本大小

textView.textSizeRes = R.dimen.my_text_size

var TextView.textSizeRes
    get() = textSize.toInt()
    set(@DimenRes textSizeRes) {
        setTextSize(COMPLEX_UNIT_PX, resources.getDimension(textSizeRes))
    }

【讨论】:

    【解决方案2】:

    打了好久终于这样解决了

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

    创建像 res/values/dimensions.xml 这样的 dimen 文件夹

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

    【讨论】:

      【解决方案3】:

      为这个答案添加一些额外的味道,因为也遇到了一些混乱。您应该可以将此测试放入您项目中的任何@RunWith(AndroidJUnit4.class) 测试中(您还需要将尺寸添加到您的dimens.xml)。

      注意:所有这些测试都通过了

      @Test public void testScaledFontSizes() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
          final Context context = InstrumentationRegistry.getTargetContext();
      
          Configuration configuration = context.getResources().getConfiguration();
          configuration.fontScale = 2.0f;
          configuration.densityDpi = 160; // mdpi, 1:1
          context.getResources().updateConfiguration(configuration, null);
      
          float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
          assertEquals(30.0f, scaledTextSize);
      
          // Create a new TextView with the explicitly set configuration
          TextView textView = new TextView(context);
          textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);
      
          // 30, because font size is scaled
          assertEquals(30.0f, textView.getTextSize());
      
          // This is what we *don't* want, it's scaled *twice*!
          textView.setTextSize(scaledTextSize);
          assertEquals(60.0f, textView.getTextSize());
      
          // DP instead of SP tests
          float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
          assertEquals(15.0f, fifteenDp);
      
          textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
          // Still 15, because it's DP, not SP
          assertEquals(15.0f, fifteenDp);
      
          textView.setTextSize(fifteenDp);
          // 30, because setTextSize DOES font scaling
          assertEquals(30.0f, textView.getTextSize());
        }
      }
      

      我发现最大的收获是TextView.setTextSize(float) 应用了字体缩放,所以如果你传入一个已经标记为 SP 而不是 DP 的维度,那么它将接收字体缩放 两次

      【讨论】:

        【解决方案4】:

        简而言之,如果你想缩小你的文本大小

        float size = mViewShabad.getTextSize()*1.1f;
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
        

        因为getTextSize()返回UNIT_PX,所以我们应该使用UNIT_PX

        【讨论】:

          【解决方案5】:

          当我们尝试通过 getTextSize() 以编程方式 setText() 时,返回值以 px 而不是 sp/dp/dip 为单位,我们知道 1sp/dp=1.5px(screen size =240)。

           titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 
          

          对我来说效果很好,或者我们可以使用 displaymatrix 到 px:sp/dp 的比率,然后用 1.5f 替换该值

          means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
          

          【讨论】:

            【解决方案6】:

            如果设置改变字体大小,导致显示错误,你可以这样做:

            setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
            

            【讨论】:

            • 谁在DIP中设置textSize?
            【解决方案7】:

            这个问题发生是因为getTextSize() 方法返回的像素大小取决于屏幕密度!要获得实际的 TextSize,请使用:

            DisplayMetrics metrics;
            metrics = getApplicationContext().getResources().getDisplayMetrics();
            float Textsize =myTextView.getTextSize()/metrics.density;
            myTextView.setTextSize(Textsize+1);
            

            我希望它能解决它:)

            【讨论】:

            • 我通过使用显示指标和setTextSize(int unit, float size)解决了我的问题。
            【解决方案8】:

            这里的区别在于setTextSize(int size)方法中,单位类型默认为“sp”或“缩放像素”。对于每个屏幕密度(ldpi、mdpi、hdpi),该值将是不同的像素尺寸。

            另一方面,getTextSize() 返回文本的实际像素尺寸。

            您可以使用setTextSize(int unit, float size) 指定单位类型。可以在 TypedValue 类中找到它的常量值,但其中一些是:

            TypedValue.COMPLEX_UNIT_PX   //Pixels
            
            TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels
            
            TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels
            

            【讨论】:

            • 我刚刚发现并准备在这里发布。非常感谢!
            • 我认为它实际上应该由 TypedValue (单数)。导入的是 android.util.TypedValue;
            • 另外需要注意的是,它只是在 API 级别 7 开始这样做。另一个荒谬的 API 中的“陷阱”。
            • 注意参数顺序很重要 - 我不小心设置了 setTextSize(size, TypedValue.COMPLEX_UNIT_SP),因为这是我错误假设的顺序!
            • 有趣的是,在我 Galaxy Nexus 上的 ICS 上,使用 setTextSize(14, TypedValue.COMPLEX_UNIT_SP) 没有效果(所以使用默认大小),但是当我升级到 Jelly Bean 时,没有显示任何文本(如 0 大小)。当我意识到我的错误时,我正要报告一个果冻豆错误!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            • 2014-12-09
            • 2015-05-11
            • 1970-01-01
            • 1970-01-01
            • 2018-04-02
            相关资源
            最近更新 更多