自动适应 TextView 和 spannableString

Posted

技术标签:

【中文标题】自动适应 TextView 和 spannableString【英文标题】:auto-fit TextView and spannableString 【发布时间】:2018-07-13 05:55:36 【问题描述】:

背景

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

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);

问题

我的问题是使文本大小适合屏幕宽度

我尝试使用这些帖子的解决方案(here 和 here),但没有一个不适用于 SpannableString。

问题

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

【问题讨论】:

【参考方案1】:

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

除了放大,我还使用了小型化

像这样:

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);

【讨论】:

【参考方案2】:

首先,这是为 Textview 设置宽度和高度的方法:

    如果您的 TextView 在 RelativeLayour 中:

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);
    如果您的 TextView 在其他任何内容中:

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);
    现在,您的tv TextView 有一个您在 xml 源代码中定义的文本大小,对吗?假设您的 TextView 字体大小为 14sp。

这意味着你的 TextView 高度是 14+6 --> 20dp

那么,看看你的tv Textview 的字体大小是多少

    我假设您的 textview 大小为 14sp。现在您需要计算您创建的 SpannableString 中的最高比例。

基于ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0); 最高比例是1.4f

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

所以你想要的最终高度是 >>

    dimens.xml 中定义这个 28dp,如下所示:

<< ? xml version = "1.0"encoding = "utf-8" ? >
  <resources >
  ...
 
  <dimen name ="dimen28">28dp< /dimen>  
 
  ... 
  
 
  </resources>
    现在你已经完成了:

params.height = getResources().getDimensionPixelSize(R.dimen.dimen28);
tv.setLayoutParams(params);

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

【讨论】:

【参考方案3】:

带入 پسر؟ 您可以获得屏幕的宽度和高度并在任何地方使用它:

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

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

tv.getLayoutParams().width = DisplayWidth;

此测量功能非常强大,请随意在任何地方使用。唯一需要考虑的是 HEIGHT,如果您的 Activity 标志位于 FULL_SCREEN 上,您实际上还需要考虑导航栏高度,这在大多数智能手机中是 48dp

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

在你的dimen.xml中定义dimen48为48dp

【讨论】:

jigar too xml Vaseye Toole Font 'wrap_content' ro Tanzim Kardi??年龄 Nasho begoo Vasat Inja ye Code Benevisam 好的,Daram Vasat Minevisam اومد。 ببین جواب میده؟ بینم میخوای طول تنظیم فونت؟ میگی سایز فونت تغییر نمیکنه؟ Khob spannableString az API21 Lollipop be Bala Kar mikone, va yek bar ham ba in tanzimat check kon: android:textAllCaps="false", "android:mtileLine", android:ellipsize="end",和 android:singleLine="false;

以上是关于自动适应 TextView 和 spannableString的主要内容,如果未能解决你的问题,请参考以下文章

textview设置部分文字颜色点击事件

Android 自定义TextView实现文本内容自动调整字体大小以适应TextView的大小

自动缩放 TextView 文本以适应范围 - 如何调用?

自动缩放 TextView 文本以适应 4.0 中的范围

Android 自定义 View 中使用 Spannable

Android 自定义 View 中使用 Spannable