自动适应TextView和spannableString

时间:2018-02-02 17:08:58

标签: android textview font-size spannablestring

背景

我需要在textView中使用SpannableString显示金额,然后将TextView的字体与给定的边界相符合,如下所示:

enter image description here

SpannableString代码:

String s= "2,000,000.000";
SpannableString ss1=  new SpannableString(s);

ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0); // set size 2
ss1.setSpan(new RelativeSizeSpan(1.2f), 2,5, 0); // set size 000 (first)
ss1.setSpan(new RelativeSizeSpan(1.2f), 6,9, 0); // set size 000 (second)
ss1.setSpan(new RelativeSizeSpan(1f), 10,13, 0); // set size 000 (Third)

TextView tv= (TextView)findViewById(R.id.money);
tv.setText(ss1);

问题

我的问题是将文字大小与屏幕宽度相匹配

我尝试使用这些帖子的解决方案(herehere),但没有一个与SpannableString不兼容。

问题

有人知道这个问题的解决方案吗?

3 个答案:

答案 0 :(得分:0)

چطوریپسر? 您可以同时获得屏幕的宽度和高度,并随处使用:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
final int DisplayHeight = displayMetrics.heightPixels;
final int DisplayWidth = displayMetrics.widthPixels;

在你的情况下,你想设置tv的宽度,如下面所示:

tv.getLayoutParams().width = DisplayWidth;

此测量非常强大,随处可用。高度考虑的唯一问题,如果你在FULL_SCREEN上有你的活动标志你实际上需要考虑导航栏高度以及大多数智能手机48dp

这意味着您可以使用DisplayHeight+ContextCompat.getDimen(mContext,R.dimen.dimen48);

并将dimen.xml中的dimen48定义为48dp

答案 1 :(得分:0)

首先,这是如何设置Textview的宽度和高度:

  1. 如果您的TextView位于RelativeLayour内:
  2. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tv.getLayoutParams();
    
    params.width = getResources().getDimensionPixelSize(R.dimen.any_width_you_want);
    params.height = getResources().getDimensionPixelSize(R.dimen.any_height_you_want);
    
    tv.setLayoutParams(params);

    1. 如果您的TextView在其他任何内容中:
    2. ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) tv.getLayoutParams();
      
      params.width = getResources().getDimensionPixelSize(R.dimen.any_width_you_want);
      params.height = getResources().getDimensionPixelSize(R.dimen.any_height_you_want);
      
      tv.setLayoutParams(params);

      1. 现在,您的tv TextView具有您在xml源中定义的文本大小吗?假设您的TextView字体大小为14sp。
      2. Tha表示您的TextView高度为14 + 6 - > 20dp

        因此,请参阅tv Textview

        的字体大小
        1. 我假设您的textview大小是14sp。现在,您需要计算您创建的SpannableString中的最高比例。
        2. 基于ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0);最高比例为1.4f

          这意味着tv的最高高度是(20dp)* 1.4

          所需的最终高度是<<<<<<<<>>>>

          1. dimens.xml中定义此28dp,如下所示:
          2. << ? xml version = "1.0"encoding = "utf-8" ? >
              <resources >
              ...
             
              <dimen name ="dimen28">28dp< /dimen>  
             
              ... 
              
             
              </resources>

            1. 现在你做完了这件事:
            2. params.height = getResources().getDimensionPixelSize(R.dimen.dimen28);
              tv.setLayoutParams(params);

              یادتنرهمنفرضکردمسایزفونتشما14هستش。 اینکارروباسایزفونتخودتانجامبده

答案 2 :(得分:0)

好吧,我自己解决了这个问题

随着扩大,我使用了小型化

像这样:

ss1.setSpan(new RelativeSizeSpan(1.2f),  0,  1,  0);
ss1.setSpan(new RelativeSizeSpan( 1f ),  2,  5,  0);
ss1.setSpan(new RelativeSizeSpan( 1f ),  6,  9,  0);
ss1.setSpan(new RelativeSizeSpan(0.8f),  10, 13, 0);