android字符串块,Android字符串进阶之一(特殊字符的输入)
本文按照遇到問題的思路展開:
(一)在Res下String.xml向字符串中插入“&”符號報錯
如下圖所示:
翻譯:在對實體的引用中,實體名必須緊跟在“&”后。
查找知道:這設計到HTML語言的字符集知識:
在網頁中除了可顯示常見的ASCII字符和漢字外,HTML還有許多特殊字符,它們一起構成了HTML字符集。有2種情況需要使用特殊字符,一是網頁中有其特殊意義的字符,二是鍵盤上沒有的字符。 字符集HTML字符可以用一些代碼來表示,代碼可以有2種表示方式。即字符代碼(命名實體)和數字代碼(編號實體)。字符代碼以&符開始,以分號結束,其間是字符名;數字代碼也以&符開始,以分號結束,其間是#號加編號。示例見下圖,完整的html字符集在文后Excel附件中,并非全部,僅常用。
(二)這涉及到了Android對此有專門的處理
文檔中有專門說明,如下圖所示:
字符串可以包含風格標簽(styling tag),需要注意的是:你必須轉碼(escaping)縮寫號( apostrophe即’)和引用號(quotation mark 即”或’)。你可風格化(style)和格式化(format)字符串。
1, 對縮寫號和引號的處理
文檔示例如下:
正確的轉碼是:
A:用雙引號將字符串全部圈住
B:使用轉義符號“\”
錯誤做法:
A:不處理
錯誤如下圖所示:
正確方法見上正確轉碼
B:使用html的字符代碼代替縮寫號
錯誤如下圖所示:
對以上錯誤的修正:
Note:因為xml并不是完全實時編譯,所以可以錯誤的xml語句并不當時報錯,但當項目啟動時,會報錯。
2, 格式化字符串(format string)
即字符串中保留參數位作為模板,可以傳入變量,轉換。eg,SimpleDateFormat
模板為:yyyy-MM-dd,傳入Date,得到1999-10-10
String.xml文件中代碼如下:
Hello,?%1$s!?You?have?%2$d?new?messages.
Java中代碼如下:
Resources?res?=?getResources();
String?text?=?String.format(res.getString(R.string.welcome_messages),?username,?mailCount);
有必要說明的是:
%:產生字面值,貌似是這個意思。
1$:代表第一個參數
2$:代表第二個參數
s:參數類型是字符串
d:參數類型是數字
Java代碼如下:
3, 在字符串中使用Html標記風格符號(Html makeup)
即Html的字符代碼。一步一步,終于排除到問題的可能解答處。
1. Android支持的Html元素,如下圖所示:
這三個字體標簽,能夠直接使用,稱之為“styled text”。內即為黑體字例如:
Welcome?toAndroid!
但是如果將以上的“
l “<”對應的字符代碼為:<
l “>”對應的字符代碼為:>
如下:
Hello,?%1$s!?You?have<b>%2$d?new?messages</b>.
稱之為“HTML-escaped”text,因為最終文本的顯示要為styled text,所以需要將Html-styled text轉為 styled text,調用fromHtml()方法。代碼如下:
Resources?res?=?getResources();
String?text?=?String.format(res.getString(R.string.welcome_messages),?username,?mailCount);
CharSequence?styledText?=?Html.fromHtml(text);
因為fromHtml()方法轉換的對象是html-styled,所以調用此方法之前,必須使用文本格式化(formated text)和TextUtil.htmlEncode()方法,確保所有的可能html字符已經被轉碼(escape)。如果代碼中含有特殊字符“&”“<”等,必須調用以上方法。代碼如下:
String?escapedUsername?=?TextUtil.htmlEncode(username);
Resources?res?=?getResources();
String?text?=?String.format(res.getString(R.string.welcome_messages),?escapedUsername,?mailCount);
CharSequence?styledText?=?Html.fromHtml(text);
測試:如果name中含有html character,不轉為html-styled,會有什么情況發生。
xml中字符串format如下:
Hello,?%1$s!?You?have<b>%2$d?new?messages</b>.
測試代碼如下:
publicvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources?rs?=?getResources();
mTextView1?=?(TextView)?findViewById(R.id.textView1);
mTextvView2?=?(TextView)?findViewById(R.id.textView2);
String?name?=?newString("");
intcount?=12345;
//未轉為html-styled
format1?=?String.format(rs.getString(R.string.welcome_messages),?name,count);
CharSequence?styledText1?=?Html.fromHtml(format1);
mTextView1.setText(styledText1);
//轉為html-styled
format2?=?String.format(rs.getString(R.string.welcome_messages),?TextUtils.htmlEncode(name),count);
CharSequence?styledText2?=?Html.fromHtml(format2);
mTextvView2.setText(styledText2);
}
模擬器顯示如下:
2. 進入TextUtil類中,htmlEncode()方法做格式化字符代碼的轉換。且Android中,只接受以上五種特殊字符。代碼如下:
/**
*?Html-encode?the?string.
*?@param?s?the?string?to?be?encoded
*?@return?the?encoded?string
*/
publicstaticString?htmlEncode(String?s)?{
StringBuilder?sb?=?newStringBuilder();
charc;
for(inti?=0;?i?
c?=?s.charAt(i);
switch(c)?{
case'
sb.append("<");//$NON-NLS-1$
break;
case'>':
sb.append(">");//$NON-NLS-1$
break;
case'&':
sb.append("&");//$NON-NLS-1$
break;
case'\'':
sb.append("'");//$NON-NLS-1$
break;
case'"':
sb.append(""");//$NON-NLS-1$
break;
default:
sb.append(c);
}
}
returnsb.toString();
}
(三)源碼中
有三處出現htmlEncode()方法。
如下圖所示:
第一處:即上文提到的TextUtils類
第二處: TextUtils的測試類,暫時不知道有什么用處
第三處:XmlParser類
定位到代碼,如下:
向上查看代碼塊描述:
顯然和之上的分析吻合。這些方法是對xml的輸出,輸出需要標準化,即 被未來的styled text(或者是其他)準確轉換convert。
(四) 流程圖
(五)單復數的處理(string format引入的問題)
文檔中說明如下:
測試各個關鍵字的效果如何。
Xml中定義plurals,如下:
Zero?song?found.
One?song?found.
Two?song?found.
Few?song?found.
Other?song?found.
Many?song?found.
代碼中如下:
publicvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
intcount1?=0;
Resources?res?=?getResources();
String?songsFound1?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count1,?count1);
TextView?textView1?=?(TextView)?findViewById(R.id.textView1);
textView1.setText(songsFound1);
intcount2?=1;
String?songsFound2?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count2,?count2);
TextView?textView2?=?(TextView)?findViewById(R.id.textView2);
textView2.setText(songsFound2);
intcount3?=2;
String?songsFound3?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count3,?count3);
TextView?textView3?=?(TextView)?findViewById(R.id.textView3);
textView3.setText(songsFound3);
intcount4?=3;
String?songsFound4?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count4,?count4);
TextView?textView4?=?(TextView)?findViewById(R.id.textView4);
textView4.setText(songsFound4);
intcount5?=4;
String?songsFound5?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count5,?count5);
TextView?textView5?=?(TextView)?findViewById(R.id.textView5);
textView5.setText(songsFound5);
intcount6?=1000;
String?songsFound6?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count6,?count6);
TextView?textView6?=?(TextView)?findViewById(R.id.textView6);
textView6.setText(songsFound6);
}
模擬器顯示如下:
即在中文狀態下,只支持one和other兩個關鍵字。
The End!
總結
以上是生活随笔為你收集整理的android字符串块,Android字符串进阶之一(特殊字符的输入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在上海,整租房子需要多少钱呢?
- 下一篇: 本田crv脚踏板原厂的多少钱?