Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
記
—— 執(zhí)劍天涯,從你的點(diǎn)滴積累開始,所及之處,必精益求精。
在實(shí)際業(yè)務(wù)開發(fā)中,時(shí)常會(huì)有這種一段Html格式的標(biāo)簽,看下圖的情況 :
在 Flutter 中,有點(diǎn)發(fā)愁,因?yàn)?Flutter 提供的 Text 與 RichText 還解析不了這種格式的,但是你也不能使用 WebView 插件,如果使用了,你會(huì)在每一個(gè)Item中嵌入一個(gè)瀏覽器內(nèi)核,再?gòu)?qiáng)的手機(jī),也會(huì)卡,當(dāng)然肯定不能這樣做,因?yàn)檫@樣就是錯(cuò)誤的做法。
小編經(jīng)過(guò)大量的嘗試與思考,終于寫出來(lái)了一個(gè)插件可以來(lái)解析了,現(xiàn)分享給大家。
小編依舊,來(lái)個(gè)pub方式:
dependencies:
flutter_html_rich_text: ^1.0.0
核心方法如下:
///htmlText 就是你的 HTML 片段了
HtmlRichText(
htmlText: txt,
),
如下代碼清單 1-3-1 就是上述圖中的效果:
/// 代碼清單 1-3-1
class TestHtmlPage extends StatefulWidget {
@override
_TestPageState createState()=> _TestPageState();
}
class _TestPageState extends State<TestHtmlPage> {
String txt="<p>長(zhǎng)途輪 <h4>高速驅(qū)動(dòng)</h4><span style='background-color:#ff3333'>"
"<span style='color:#ffffff;padding:10px'> 3條立減 購(gòu)胎抽獎(jiǎng)</span></span></p>"
"<p>長(zhǎng)途高速驅(qū)動(dòng)輪<span ><span style='color:#cc00ff;'> 3條立減 購(gòu)胎抽獎(jiǎng)</span></span></p>";
@override
Widget build(BuildContext context) {
return Scaffold(
///一個(gè)標(biāo)題
appBar: AppBar(title: Text('A頁(yè)面'),),
body: Center(
///一個(gè)列表
child: ListView.builder(
itemBuilder: (BuildContext context, int postiont) {
return buildItemWidget(postiont);
},
itemCount: 100,
),
),
);
}
///ListView的條目
Widget buildItemWidget(int postiont) {
return Container(
///內(nèi)容邊距
padding: EdgeInsets.all(8),
child: Column(
///子Widget左對(duì)齊
crossAxisAlignment: CrossAxisAlignment.start,
///內(nèi)容包裹
mainAxisSize: MainAxisSize.min,
children: [
Text(
"測(cè)試標(biāo)題 $postiont",
style: TextStyle(fontWeight: FontWeight.w500),
),
///html富文本標(biāo)簽
Container(
margin: EdgeInsets.only(top: 8),
child: HtmlRichText(
htmlText: txt,
),
)
],
),
);
}
}
以下是解析思考 燒腦的實(shí)踐
Flutter 應(yīng)用程序被 Android iOS平臺(tái)加載,在原生 Android 中,使用TextView就可輕松實(shí)現(xiàn)解析(如下代碼清單2-1),當(dāng)然在iOS中使用UILabel也可輕松實(shí)現(xiàn)(如下代碼清單2-2)。
// Android 原生 TextView加載Html的核心方法
//代碼清單2-1
// MxgsaTagHandler 定義的一個(gè) TagHandler 用來(lái)處理點(diǎn)擊事件
lTextView.setText(Html.fromHtml(myContent, null, new MxgsaTagHandler(context)));
lTextView.setClickable(true);
lTextView.setMovementMethod(LinkMovementMethod.getInstance());
iOS UILable
// iOS 原生 UILabel加載Html的核心方法
//代碼清單2-2
//返回的HTML文本 如 <font color='red'></font>
NSString *str=@"htmlText";
NSString *HTMLString=[NSString stringWithFormat:@"<html><body>%@</body></html>", str ];
NSDictionary *options=@{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)
};
NSData *data=[HTMLString dataUsingEncoding:NSUTF8StringEncoding];
NSMutableAttributedString * attributedString=[[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
NSMutableParagraphStyle *paragraphStyle=[[NSMutableParagraphStyle alloc] init]; // 調(diào)整行間距
paragraphStyle.lineSpacing=8.0;
paragraphStyle.alignment=NSTextAlignmentJustified;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, attributedString.length)];
[attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:15] range:NSMakeRange(0, attributedString.length)];
_uiLabel.backgroundColor=[UIColor cyanColor];
_uiLabel.numberOfLines=0;
_uiLabel.attributedText=attributedString;
[_uiLabel sizeToFit];
然后對(duì)于 Flutter 來(lái)講是可以順利的加載原生 View的 ,如下代碼清單 2-3所示就是在Flutter中通過(guò) AndroidView 與 UiKitView來(lái)實(shí)現(xiàn)。
//Flutter中加載原生View核心方法
//代碼清單2-3
buildAndroidView() {
return AndroidView(
//設(shè)置標(biāo)識(shí)
viewType: "com.studyon./text_html",
//參數(shù)的編碼方式
creationParamsCodec: const StandardMessageCodec(),
);
}
/// 通過(guò) UiKitView 來(lái)加載 iOS原生View
buildUIKitView() {
return UiKitView(
//標(biāo)識(shí)
viewType: "com.studyon./text_html",
//參數(shù)的編碼方式
creationParamsCodec: const StandardMessageCodec(),
);
}
于是小編開發(fā)了第一波操作,開發(fā)了這樣的一個(gè)插件來(lái)調(diào)用原生 View 實(shí)現(xiàn)渲染富文本標(biāo)簽,這個(gè)插件使用方式很簡(jiǎn)單,如下所示:
HTMLTextWidet(
htmlText: "測(cè)試一下",
)
這一步操作真是所謂的騷操作,其實(shí)小編在開發(fā)前就覺得不太合適,不過(guò)以小編的個(gè)性,非得嘗試驗(yàn)證一下,現(xiàn)結(jié)果出來(lái)了,就是在加載時(shí),由于應(yīng)用在列表中,使用 HTMLTextWidet 會(huì)有短暫的黑屏效果,而且內(nèi)存出吃不消,如下圖所示:
為什么會(huì)黑屏,閑魚技術(shù)團(tuán)隊(duì)有過(guò)論述在《Flutter中嵌入Native組件的正確姿勢(shì)》 以及 文章 《深入了解Flutter界面開發(fā)中有詳細(xì)論述》 。
所以結(jié)果是 :不可行。
用 Java 的思想來(lái)解析 String 的方式來(lái)處理 HTML 字符串,處理成小片段,然后使用Text結(jié)合 流式布局 Wrap 來(lái)組合,核心代碼如下清單 3-1 所示為解析:
/*
解析標(biāo)簽
*/
List<TagColorModel> findBackGroundColor(String htmlStr) {
List<TagColorModel> tagColorModelList=[];
List<String> colorSpiltList=[];
String driverAdvertisement=htmlStr;
if (driverAdvertisement !=null) {
colorSpiltList=driverAdvertisement.split("background-color");
for (var i=0; i < colorSpiltList.length; i++) {
TagColorModel itemColorModel=TagColorModel();
String colorsStr=colorSpiltList[i];
List<String> itemSpiltList=colorsStr.split(":#");
for (var j=0; j < itemSpiltList.length; ++j) {
String item=itemSpiltList[j];
String itemColor="";
String itemText="";
try {
if (item.length >=6) {
itemColor=item.toString().substring(0, 6);
if (itemColor.trim().toUpperCase()=="FFFFFF") {
itemColorModel.backGroundColor=ColorUtils.getRandomColor();
} else {
itemColorModel.backGroundColor=new Color(
int.parse(itemColor.trim(), radix: 16) + 0xFF000000);
}
int startIndex=item.indexOf("\">");
int endIndex=item.indexOf("</");
if (startIndex !=-1 && endIndex >=startIndex) {
LogUtil.e("startIndex $startIndex endIndex $endIndex ");
itemText=item.substring(startIndex + 2, endIndex);
LogUtil.e("itemColor $itemColor itemText $itemText ");
itemColorModel.text=itemText;
tagColorModelList.add(itemColorModel);
}
}
} catch (e) {
///解析異常的 不必處理
}
}
}
}
LogUtil.e("${tagColorModelList.length} \n\n ");
return tagColorModelList;
}
然后 TagColorModel 的定義如下代碼清單 3-2所示:
///代碼清單 3-2
class TagColorModel {
///背景
Color backGroundColor;
///文本顏色
Color textColor;
///文本
String text;
TagColorModel(
{this.text="",
this.backGroundColor=Colors.transparent,
this.textColor=Colors.white});
}
然后就是使用 Wrap 來(lái)使用解析的內(nèi)容,如下代碼清單3-3所示:
///代碼清單 3-3
///獲取背景顏色
List<TagColorModel> colorList=findBackGroundColor(htmlStr);
List<Widget> tagList=[];
for (var i=0; i < colorList.length; ++i) {
TagColorModel model=colorList[i];
tagList.add(Container(
margin: EdgeInsets.only(right: 2, left: 4, top: 4),
padding: EdgeInsets.only(left: 6, right: 6),
decoration: BoxDecoration(
color: model.backGroundColor,
borderRadius: BorderRadius.all(Radius.circular(2)),
),
child: Text(
"${model.text}",
style: TextStyle(fontSize: 12, color: model.textColor),
),
));
}
///然后再使用 Wrap 包裹
Wrap(
alignment: WrapAlignment.spaceBetween,
children: tagList,
),
實(shí)踐結(jié)果:可行,但是有兼容性差,效率低。
當(dāng)然閑魚團(tuán)隊(duì)在文章《如何低成本實(shí)現(xiàn)Flutter富文本,看這一篇就夠了!》 中也有詳細(xì)論述過(guò),與上述的思路差不多。
當(dāng)在Flutter中 Dart 從網(wǎng)站中提取數(shù)據(jù)時(shí),html依賴庫(kù)是一個(gè)不錯(cuò)的選擇,html 是一個(gè)開源的 Dart 包,主要用于從 HTML 中提取數(shù)據(jù),從中獲取節(jié)點(diǎn)的屬性、文本和 HTML以及各種節(jié)點(diǎn)的內(nèi)容。
dependencies:
html: ^0.14.0+3
于是乎小編也開始嘗試,首先是使用 Html 庫(kù)解析 HTML文本塊,將解析的 Document 通過(guò)遞歸方式遍歷出來(lái)所有的 node 節(jié)點(diǎn),如下代碼清單4-1所示:
代碼清單4-1
import 'package:html/parser.dart' as parser;
import 'package:html/dom.dart' as dom;
List<Widget> parse(String originHtmlString) {
// 空格替換 去除所有 br 標(biāo)簽用 \n 代替,
originHtmlString=originHtmlString.replaceAll('<br/>', '\n');
originHtmlString=originHtmlString.replaceAll('<br>', '\n');
originHtmlString=originHtmlString.replaceAll('<br />', '\n');
///html 依賴庫(kù)解析
dom.Document document=parser.parse(originHtmlString);
///獲取 DOM 中的 node 節(jié)點(diǎn)
dom.Node cloneNode=document.body.clone(true);
// 注意: 先序遍歷找到所有關(guān)鍵節(jié)點(diǎn)(由于是引用傳值,所以需要重新獲取一遍 hashCode)
List<dom.Node> keyNodeList=new List<dom.Node>();
int nodeIndex=0;
///遞歸遍歷
parseNodesTree(cloneNode, callBack: (dom.Node childNode) {
if (childNode is dom.Element &&
truncateTagList.indexOf(childNode.localName) !=-1) {
print('TEST: truncate tag nodeIndex=${nodeIndex++}');
keyNodeList.add(childNode);
// 注意: 對(duì)于占據(jù)整行的圖片也作為關(guān)鍵節(jié)點(diǎn)處理
} else if (childNode is dom.Element &&
childNode.localName=='img' &&
checkImageNeedNewLine(childNode)) {
print('TEST: one line image nodeIndex=${nodeIndex++}');
keyNodeList.add(childNode);
}
});
}
///遞歸遍歷
void parseNodesTree(dom.Node node,
{NodeTreeCallBack callBack=printNodeName}) {
///遍歷 Node 節(jié)點(diǎn)
for (var i=0; i < node.nodes.length; ++i) {
dom.Node item=node.nodes[i];
callBack(item);
parseNodesTree(item, callBack: callBack);
}
}
然后就是將 得出的 node 節(jié)點(diǎn) 與 Flutter 組件映射,文本使用 TextSpan ,圖片使用 Image ,然后將 樣式使用 TextStyle 映射,然后最后將解析的結(jié)果組件使用 Wrap 來(lái)包裹,就達(dá)到了現(xiàn)在的插件 flutter_html_rich_text 。
綜合實(shí)現(xiàn)思路就是 使用 HTML 庫(kù)完善了【燒腦思考實(shí)踐二】中的解析。
解析篇幅較長(zhǎng),大家有興趣可以看下 github 源碼。
完畢
者博客
http://www.jianshu.com/u/0fa6f5d09040
文章目錄
前言
場(chǎng)景
實(shí)現(xiàn)方式
drawable屬性
Spannable使用
HTML顯示
總結(jié)
0
前言
在使用TextView的時(shí)候,我們經(jīng)常需要在TextView中進(jìn)行圖文混排,比如在QQ中聊天的消息中的表情,底部tab圖標(biāo)等。
1
場(chǎng)景
2
實(shí)現(xiàn)方式
Android官方對(duì)TextView的圖文混排提供了支持,我們可以從以下三種方式實(shí)現(xiàn)TextView的圖文混排:
1.在TextView中使用Compound Drawable屬性;
2.在TextView中使用Spannable多樣式顯示;
3.在TextView中顯示HTML文本。
3
drawable屬性
在TextView中使用Compound Drawable屬性可以在文字的上下左右放置drawable,效果如下:
一共有兩種方式可以實(shí)現(xiàn):XML布局設(shè)置和Java代碼設(shè)置。
1. xml布局
2. java代碼
注意:必須setBounds測(cè)量圖片邊界,否則不顯示。
3.缺陷
當(dāng)TextView設(shè)置成固定大小時(shí),由于文字距離邊界的距離過(guò)大,會(huì)導(dǎo)致文字與圖片之間設(shè)置的間距無(wú)效,如下圖。
解決方案:
①設(shè)置TextView的內(nèi)填充
通過(guò)設(shè)置paddingLeft、paddingRight、paddingTop、paddingBottom來(lái)縮寫這個(gè)間距
②自定義TextView重新布局
a.先自定義屬性iconPadding來(lái)設(shè)置間距,并提供方法給外部調(diào)用。
b.重寫setCompoundDrawablesWithIntrinsicBounds方法來(lái)獲取我們?cè)O(shè)置的drawable寬高。
c.最后重寫onLayout方法。
可以先參考:Android技巧之drawablePadding的那些事(https://yuxingxin.com/2015/11/05/DrawablePadding/),該篇文章只解決了左右失效的問(wèn)題。后期會(huì)整理個(gè)解決圖文混排的工具庫(kù),里面會(huì)有具體方案。
4
Spannable使用
1.簡(jiǎn)介
setText(CharSequence text)中接收的是CharSequence。而SpannableString和SpannableStringBuilder是其實(shí)現(xiàn)類,是可以直接賦值的。并且兩者的setSpan方法可以設(shè)置一些格式對(duì)象(例如字體大小、下劃線、替換為圖片等),這就可以實(shí)現(xiàn)富文本了。
Spannable實(shí)現(xiàn)子類:SpannableString,SpannableStringBuilder(可變,類似于StringBuilder)。
Spannable中定義了抽象方法:setSpan(Object what, int start, int end, int flags)和removeSpan(Object what)。這兩個(gè)方法實(shí)現(xiàn)了對(duì)字符串的靈活編輯。
其中setSpan方法包含如下參數(shù):
flags常用的有四種
通常在insert方式才生效,平時(shí)不生效,具體看:Explain the meaning of Span flags like SPAN_EXCLUSIVE_EXCLUSIVE。(https://stackoverflow.com/questions/9879233/explain-the-meaning-of-span-flags-like-span-exclusive-exclusive)
2.常用span類
3.使用方式
其中ImageSpan默認(rèn)對(duì)其方式有兩種:ALIGN_BOTTOM及ALIGN_BASELINE。很可惜我們平常用的居中對(duì)其的方式?jīng)]有,不過(guò)可以通過(guò)自定義實(shí)現(xiàn),后續(xù)會(huì)在開源出來(lái)。
4.效果
5
HTML顯示
一般顯示HTML內(nèi)容有兩種方式:
使用 Android 提供的 WebView 控件。
通過(guò)將 HTML 內(nèi)容轉(zhuǎn)化為 Spanned 格式在 TextView 中進(jìn)行顯示。
現(xiàn)在大多數(shù)都用WebView的方式。但是并不是所有的場(chǎng)景下都適合使用 WebView 來(lái)顯示 HTML 內(nèi)容,例如,如果應(yīng)用要顯示的內(nèi)容只是一部分 HTML 片段,就可以利用 TextView 來(lái)進(jìn)行顯示,并且效率較高。
由于這種方式不太常用,就不深入介紹,里面可以實(shí)現(xiàn)的效果還是很好的。
1.簡(jiǎn)介
Android 中的 TextView 組件常用于顯示文本內(nèi)容,其實(shí)它也可以顯示 HTML 的內(nèi)容。
簡(jiǎn)單來(lái)講,這就需要先把 HTML 的內(nèi)容以字符串的形式獲取后,經(jīng)過(guò) android.text.Html.fromHtml轉(zhuǎn)化成 Spanned 的格式,然后將其傳遞到 TextView 的 setText方法中,這樣就可以在 TextView 中顯示 HTML 頁(yè)面的內(nèi)容了。
需要注意的是,并不是所有的 HTML 標(biāo)簽在 TextView 中都是支持的,且官方文檔并沒有明確的說(shuō)明支持 HTML 標(biāo)簽列表,通過(guò)查看 Android 源代碼,可以得到簡(jiǎn)單的支持列表。
下面的示例來(lái)介紹如何在 TextView 中顯示一段 HTML 內(nèi)容,要顯示的這段 HTML 內(nèi)容即包含超鏈接內(nèi)容,也包含有圖片。
2.使用
fromHtml方法
source,就是包含 HTML 內(nèi)容的字符串。Html.ImageGetter 和 Html.TagHandler 是兩個(gè)接口,提供給開發(fā)者繼承使用。
imageGetter, 如果要顯示圖片是需要被繼承的,重寫 getDrawable(String source)方法,用于獲取 HTML 里面的圖片來(lái)顯示在 TextView 中。
tagHandler,其作用是把 HTML 帶標(biāo)記的文本內(nèi)容字符串轉(zhuǎn)化成可以顯示效果的的 Spanned 字符串 。由于并非所有的 HTML 標(biāo)簽都可以轉(zhuǎn)化,所以在使用時(shí),用戶需要自己添加一些必要的標(biāo)簽和處理方法時(shí)才會(huì)繼承使用的。
繼承ImageGetter
繼承于 ImageGetter,重寫 getDrawable (String source) 方法。通過(guò)異步操作,讀取本地/網(wǎng)絡(luò)資源,獲得drawable對(duì)象。
繼承TagHandler
繼承于 TagHandler,重寫了 handleTag方法。為了支持更多的標(biāo)簽,例如為了支持<ul><ol><dd>和<li>標(biāo)簽,這四個(gè)標(biāo)簽是在 formHtml方法中本身是不支持。
如果開發(fā)者認(rèn)為安卓 TagHandler 提供的默認(rèn)標(biāo)簽解析已經(jīng)夠用,直接在 fromHtml方法中第三個(gè)參數(shù)的地方填寫 既可。
最后,通過(guò) formHtml方法將 HTML 內(nèi)容轉(zhuǎn)化為可供顯示的 SpannableString,將 SpannableString 通過(guò) setText 方法放入 TextView 中,就可以顯示圖文并茂的內(nèi)容了。
用戶交互
formHtml方法已經(jīng)將 HTML 內(nèi)容中的超鏈接和圖片轉(zhuǎn)義成為 UrlSpan 和 ImageSpan,進(jìn)而在 TextView 中完成顯示。但是此時(shí)是沒有任何用戶交互的,用戶只能看到 HTML 的內(nèi)容,下面介紹如何添加用戶交互功能。
要完成用戶交互,這里我們需要在 TextView 中還需要調(diào)用textView.setMovementMethod方法。
Android 提供了 LinkMovementMethod 類以實(shí)現(xiàn)了對(duì)于文本內(nèi)容中超鏈接的遍歷,并且支持對(duì)于超鏈接的點(diǎn)擊事件。
所以只要在添加下面一行代碼,就可以使點(diǎn)擊 UrlSpan 能夠觸發(fā)打開鏈接的功能。
如果想要更多的用戶交互效果,可以自定義LinkMovementMethod 類,重寫onTouchEvent方法來(lái)實(shí)現(xiàn)。
3.效果
關(guān)于HTML顯示這部分,沒做具體實(shí)現(xiàn)。具體可以看:靈活高效的在 Android Native App 開發(fā)中顯示 HTML 內(nèi)容(https://www.ibm.com/developerworks/cn/web/1407_zhangqian_androidhtml/index.html),里面有具體源碼可以下載,HTML部分內(nèi)容也是參考該篇文章完成的。
開源庫(kù):html-textview
https://github.com/PrivacyApps/html-textview
6
總結(jié)
以上就是關(guān)于圖文混排的一些解決方案,相信通過(guò)這些了解,對(duì)于工作中的實(shí)際場(chǎng)景的使用大家會(huì)有適當(dāng)?shù)慕鉀Q方案。由于實(shí)際應(yīng)用較少,所以認(rèn)識(shí)較為淺顯,可能有些地方描述不當(dāng),后期會(huì)考慮封裝個(gè)解決圖文混排的工具類,加深下理解。
TextView添加背景,或者是給TextView添加添加邊框,以及怎么樣設(shè)置TextView的形狀。怎么在java代碼部分設(shè)置TextView的背景,和TextView的形狀及邊框。
方法如下:
怎么在Java代碼部分怎么設(shè)置TextView的背景顏色,其實(shí)很簡(jiǎn)單的就一句話。
tvTemp.setBackgroundColor(Color.parseColor("#00FF00"));
在xml布局文件中就可以直接調(diào)用drawable文件代碼如下:
android:background="@drawable/textview"
在設(shè)置背景的時(shí)候, 我們都知道使用 setBackgroundColor()方法,但是,方法里面的參數(shù),必須是RGB HTML格式的值,如果我們用drawable,它會(huì)提示drawable是int類型的。(其實(shí)如果可以的話我們不妨使用ImageView組件,這個(gè)組件相對(duì)TextView更好用)。
接下來(lái)就來(lái)看看怎么給讓TextView顯示邊框,并且怎么樣讓其顯示圓形。這里我們就需要在drawable里面,新建一個(gè).xml文件。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false">
<solid android:color="#00FF00" />
<stroke android:width="1dip" android:color="#000000" />
<size
android:width="15dp"
android:height="15dp" />
</shape>
這只是一個(gè)圓形,其中, stroke屬性,是設(shè)置的他的邊框顏色和寬度,在xml布局中顯示的是如圖所示的樣式:
xml樣式
可以在xml文件中利用drawable調(diào)用。其中在xml中不僅可以設(shè)置圓形,而且還可以設(shè)置圓角,
<corners android:radius="15dp" />屬性就是設(shè)置圓角
我們?cè)诮榻B一些關(guān)于shape里面的知識(shí):
gradient -- 顏色漸變
startcolor 起點(diǎn)顏色
endcolor 終點(diǎn)顏色
android:angle 角度 0是從左到右,90是從下到上
solid -- 填充
stroke -- 描邊
corners -- 圓角
padding -- 內(nèi)容離邊界的距離
當(dāng)需要在java代碼中需要設(shè)置TextView時(shí),發(fā)現(xiàn)通過(guò)上面的方法設(shè)置,圓角就會(huì)消失,在這里怎么讓圓角不會(huì)消失,我們需要:
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。