此文主要记录开发中遇到的VIVO手机上设置下划线不显示或者显示线段较细的问题:
因为涉及到多语言,所以在给textview设置下划线时不能直接采用new SpannableString("***")方式根据start和end位置去设置下划线或者点击事件,于是使用在strings.xml文件中去设置html方式实现。如下:
<string name="scan4ginfotxt2"><Data><![CDATA[2.听到提示音\"收到配置信息\"后,设备开始入网。<a href="">没有听到任何提示音?</a>]]></Data></string>
此处对“没有听到任何提示音?”文字进行标红、设置下划线、设置可点击跳转,代码如下:
String tips = String.format(getResources().getString(R.string.scan4ginfotxt2)); mTip.setText(getClickableHtml(tips,0)); mTip.setMovementMethod(LinkMovementMethod.getInstance());
/** * 格式化超链接文本内容并设置点击处理 * */ private CharSequence getClickableHtml(String html,int position) { Spanned spannedHtml; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // flags // FROM_HTML_MODE_COMPACT:html块元素之间使用一个换行符分隔 // FROM_HTML_MODE_LEGACY:html块元素之间使用两个换行符分隔 spannedHtml = Html.fromHtml(html,Html.FROM_HTML_MODE_COMPACT); } else { spannedHtml = Html.fromHtml(html); } SpannableStringBuilder clickableHtmlBuilder = new SpannableStringBuilder(spannedHtml); URLSpan[] urls = clickableHtmlBuilder.getSpans(0, spannedHtml.length(), URLSpan.class); for(final URLSpan span : urls) { setLinkClickable(clickableHtmlBuilder, span , position); } return clickableHtmlBuilder; } /** * 设置点击超链接对应的处理内容 * */ private void setLinkClickable(SpannableStringBuilder clickableHtmlBuilder,URLSpan urlSpan,int position) { int start = clickableHtmlBuilder.getSpanStart(urlSpan); int end = clickableHtmlBuilder.getSpanEnd(urlSpan); int flags = clickableHtmlBuilder.getSpanFlags(urlSpan); ClickableSpan clickableSpan = new ClickableSpan() { public void onClick(View view) { if(position == 0){ //todo }else { //todo } } @Override public void updateDrawState(@NonNull TextPaint ds) { //自定义颜色和下划线 ds.setColor(getResources().getColor(R.color.color_red)); ds.setUnderlineText(true); } }; clickableHtmlBuilder.clearSpans(); clickableHtmlBuilder.setSpan(clickableSpan, start, end, flags); }
这样实现后基本上手机都能达到想要的效果,但在实际过程中发现vivoY85A(Android8.1.0)手机出现下划线显示线段较细的问题,最终排查发现,在xml布局里面需要设置Textview的一个固定高度才行,如:
android:layout_height="wrap_content" android:minHeight="30dp"
出现下划线不显示问题,发现是在xml里设置了
android:textSize="13sp"
此时需要在updateDrawState中重新设置TextPaint的尺寸:
//自定义颜色和下划线 ds.setColor(getResources().getColor(R.color.color_red)); ds.setUnderlineText(true); ds.setTextSize(HiTools.sp2px(Config4GAPNActivity.this,13));