字符串資源里變量替換
Android開發中是拒絕硬編碼的,我們可能會把一些字符串放在xml中當作資源使用,假設有如下情況:
你好A,歡迎使用我們的App。
我們在程序中需要使用這個字符串,但是A是一個變量,很常規的辦法是取出這個字符串,然后用String的replace方法把A替換成用戶的昵稱。
其實,在android中有這樣一個東西,那就是 XLIFF,全稱叫 XML本地化數據交換格式,英文全稱 XML Localization Interchange File Format。
用法也是很簡單的,如
你好%1$s,歡迎使用我們的App。
程序中只要給變量賦值就可以了,如
String welcome = getString(R.string.welcome, "小丸子");
把字符串打印出來如下
這里的1代表第一個變量,多個變量的話依次遞增即可。
TextView xml文件可配置的屬性
android:autoLink? ? 設置是否當文本為URL鏈接/email/電話號碼/map時,文本顯示為可點擊的鏈接??蛇x值(none/web/email/phone/map/all)
android:autoText? ? 如果設置,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法并輸入的時候起作用。
android:bufferType? 指定getText()方式取得的文本類別。選項editable 類似于StringBuilder可追加字符,
也就是說getText后可調用append方法設置文本內容。spannable 則可在給定的字符區域使用樣式,參見這里1、這里2。
android:capitalize? 設置英文字母大寫類型。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
android:cursorVisible? 設定光標為顯示/隱藏,默認顯示。
android:digits? 設置允許輸入哪些字符。如“1234567890.+-*/%\n()”
android:drawableBottom? 在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,并且同時和background使用時覆蓋后者。
android:drawableLeft? ? 在text的左邊輸出一個drawable,如圖片。
android:drawablePadding 設置text與drawable(圖片)的間隔,與drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可設置為負數,單獨使用沒有效果。
android:drawableRight? 在text的右邊輸出一個drawable,如圖片。
android:drawableTop 在text的正上方輸出一個drawable,如圖片。
android:editable? ? 設置是否可編輯。這里無效果,參見EditView。
android:editorExtras? ? 設置文本的額外的輸入數據。在EditView再討論。
android:ellipsize? 設置當文字過長時,該控件該如何顯示。有如下值設置:”start”—–省略號顯示在開頭;”end”——省略號顯示在結尾;”middle”—-省略號顯示在中間;”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)
android:freezesText 設置保存文本的內容以及光標的位置。參見:這里。
android:gravity 設置文本位置,如設置成“center”,文本將居中顯示。
android:hint? ? Text為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在EditView中使用,但是這里也可以用。
android:imeOptions? 附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個“完成”,而不設置默認是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId 設置IME動作ID。在EditView再做說明,可以先看這篇帖子:這里。
android:imeActionLabel? 設置IME動作標簽。在EditView再做說明。
android:includeFontPadding? 設置文本是否包含頂部和底部額外空白,默認為true。
android:inputMethod 為文本指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是這里報錯找不到。
android:inputType? 設置文本的類型,用于幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
android:marqueeRepeatLimit? 在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為marquee_forever時表示無限次。
android:ems 設置TextView的寬度為N個字符的寬度。這里測試為一個漢字字符寬度,如圖:
android:maxEms? 設置TextView的寬度為最長為N個字符的寬度。與ems同時使用時覆蓋ems選項。
android:minEms? 設置TextView的寬度為最短為N個字符的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength? 限制顯示的文本長度,超出部分不顯示。
android:lines? 設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據。
android:maxLines? ? 設置文本的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
android:minLines? ? 設置文本的最小行數,與lines類似。
android:linksClickable? 設置鏈接是否點擊連接,即使設置了autoLink。
android:lineSpacingExtra? ? 設置行間距。
android:lineSpacingMultiplier? 設置行間距的倍數。如”1.2”
android:numeric 如果被設置,該TextView有一個數字輸入法。此處無用,設置后唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。
android:password? ? 以小點”.”顯示文本
android:phoneNumber 設置為電話號碼的輸入方式。
android:privateImeOptions? 設置輸入法選項,此處無用,在EditText將進一步討論。
android:scrollHorizontally? 設置文本超出TextView的寬度的情況下,是否出現橫拉條。
android:selectAllOnFocus? ? 如果文本是可選擇的,讓他獲取焦點而不是將光標移動為文本的開始位置或者末尾位置。TextView中設置后無效果。
android:shadowColor 指定文本陰影的顏色,需要與shadowRadius一起使用。效果:
android:shadowDx? ? 設置陰影橫向坐標開始位置。
android:shadowDy? ? 設置陰影縱向坐標開始位置。
android:shadowRadius? ? 設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
android:singleLine? 設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,后面用“…”來表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"將只顯示“t…”。如果不設置singleLine或者設置為false,文本將自動換行
android:text? ? 設置顯示文本.
android:textAppearance? 設置文字外觀。如“?android:attr/textAppearanceLargeInverse
”這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用默認的外觀??稍O置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textColor? 設置文本顏色
android:textColorHighlight? 被選中文字的底色,默認為藍色
android:textColorHint? 設置提示信息文字的顏色,默認為灰色。與hint一起使用。
android:textColorLink? 文字鏈接的顏色.
android:textScaleX? 設置文字之間間隔,默認為1.0f。分別設置0.5f/1.0f/1.5f/2.0f效果如下:
android:textSize? ? 設置文字大小,推薦度量單位”sp”,如”15sp”
android:textStyle? 設置字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設置一個或多個,用“|”隔開
android:typeface? ? 設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體) 3]
android:height? 設置文本區域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight? 設置文本區域的最大高度
android:minHeight? 設置文本區域的最小高度
android:width? 設置文本區域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width的區別看這里。
android:maxWidth? ? 設置文本區域的最大寬度
android:minWidth? ? 設置文本區域的最小寬度
TextView中設置多種字體大小
比如在項目中經常遇到如下UI,
像這樣的兩種字體大小放到一個TextView中,我們應該如何處理呢?需要用到 android.text 命名空間下的一些與spannable相關的類和接口。如下:
String text = "您已經連續走了5963步";
int start = text.indexOf('5');
int end = text.length();
Spannable textSpan = new SpannableStringBuilder(text);
textSpan.setSpan(new AbsoluteSizeSpan(16), 0, start, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(26), start, end - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(16), end - 1, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(textSpan);
這個經過轉化過的textSpan就是我們需要的。
TextView中設置超鏈接
這個比較簡單,設置我們上邊提到的android:autoLink屬性,默認為none。該屬性的幾個常量如下:
代碼中的設置方式:setAutoLinkMask(int)。
參數和上邊列表對應,分別為:Linkify.WEB_URLS,Linkify.EMAIL_ADDRESSES,Linkify.PHONE_NUMBERS,Linkify.MAP_ADDRESSES,Linkify.ALL
但是需要注意的是,當我們需要定制超鏈接的跳轉時應該怎么做?答案是還是選擇Spannable。代碼如下:
//將TextView的顯示文字設置為SpannableString
testText.setText(getClickableSpan());
//設置該句使文本的超連接起作用
testText.setMovementMethod(LinkMovementMethod.getInstance());
//設置超鏈接文字
private SpannableString getClickableSpan() {
SpannableString spanStr = new SpannableString("使用該軟件,即表示您同意該軟件的使用條款和隱私政策");
//設置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, UsageActivity.class));
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, PrivacyActivity.class));
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
運行效果如下圖:
插入圖片
Android中可以使用TextView的drawableXXX屬性在文字周圍插入圖片。圖片和文字之間的間距可以通過android:drawablePadding來設置。
xml中屬性為:
android:drawableLeft
android:drawableTop
android:drawableRight
android:drawableBottom
代碼中的設置方式:setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)。
left,top等需傳入資源id,不需要的話傳0.
陰影
Android中設置陰影也比較簡單,xml中可以這樣設置:
android:shadowColor //指定文本陰影的顏色
android:shadowDx //設置陰影橫向坐標開始位置
android:shadowDy //設置陰影縱向坐標開始位置
android:shadowRadius //設置陰影的半徑。設置為0.1會變成字體的顏色
代碼中通過方法public void setShadowLayer (float radius, float dx, float dy, int color)來設置。
我的參數是這樣的:
android:shadowColor="#ffffff"
android:shadowDx="15.0"
android:shadowDy="5.0"
android:shadowRadius="2.5"
效果如下圖:
字體加粗或者傾斜
在xml布局文件中使用android:textStyle=”bold”可以將文字設置成粗體。在代碼中設置的方法是:使用TextPaint的仿“粗體”設置setFakeBoldText為true。示例代碼如下:
tv.getPaint().setFakeBoldText(true);
textstyle可設置的屬性有:
italic為傾斜,多屬性可用”|”分開。
文字過長顯示省略號或者跑馬燈效果
android:maxEms="6" //限制顯示的字符長度
android:singleLine="true" //單行顯示
android:ellipsize="end"http://在結尾用省略號
android:ellipsize設置當文字過長時,該控件該如何顯示。有如下值設置:
”start”—–省略號顯示在開頭;
”end”——省略號顯示在結尾;
”middle”—-省略號顯示在中間;
”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)
android:marqueeRepeatLimit 在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為marquee_forever時表示無限次。實現需要控件獲得焦點。
示例代碼:
android:marqueeRepeatLimit="marquee_forever"
android:ellipsize="marquee"
android:singleLine="true"
android:focusableInTouchMode="true"
android:focusable="true"
效果如下:
設置行間距
1、android:lineSpacingExtra
設置行間距,如”3dp”。
2、android:lineSpacingMultiplier
設置行間距的倍數,如”1.2″。
關于字體
我們可以通過設置android:typeface屬性來控制字體,可以設置為normal, sans, serif, monospace四種。具體如下:
代碼中可以通過setTypeface(Typeface)方法設置。但有時候我們的App可能需要使用特殊的字體,這時候怎么辦呢?可以通過如下代碼設置:
Typeface mTypeFace = Typeface.createFromAsset(getAssets(), "kaiti.ttf");
textview.setTypeface(mTypeFace);
然后將我們的字體文件放到assets文件夾下。
但是需要注意的是,不要大量使用這種自定義字體,因為自定義字體會消耗更多的性能。
TextView中設置Html
TextView支持的Html標簽
Textview只支持部分的html標簽。具體如下:
//定義粗體文字? b 是blod的縮寫
//定義大字體的文字
//引用塊標簽
//定義換行
//表示引用的URI
//定義標簽? dfn 是defining instance的縮寫
//強調標簽? em 是emphasis的縮寫
//定義斜體文字
// 段落標簽,里面可以加入文字,列表,表格等
//定義小字體的文字
// 定義刪除線樣式的文字? 不符合標準網頁設計的理念,不贊成使用.? strike是strikethrough的縮寫
//重點強調標簽
//下標標簽? sub 是subscript的縮寫
//上標標簽? sup 是superscript的縮寫
//定義monospaced字體的文字? 不贊成使用.? 此標簽對中文沒意義? tt是teletype or monospaced text style的意思
//定義帶有下劃線的文字? u是underlined text style的意思
顯示多種顏色的字
Android支持html格式的字符串,通過調用Html.fromHtml(str)方法可以轉換html格式的字符串str。示例代碼如下:
TextView textth = (TextView) findViewById(R.id.textth);
String textStr1 = "如果有一天,";
String textStr2 = "我悄然離去";
textth.setText(Html.fromHtml(textStr1 + textStr2));
效果如圖:
字體加粗
字體加粗還可以通過設置html格式字符串來實現
String textStr1 = "sdfa";
textth.setText(Html.fromHtml(textStr1));
插入圖片
插入圖片還可以用html字符串來實現。不過需要用到ImageGetter類來對圖片的src屬性進行轉換。
代碼如下:
String imgStr = "sdfa
";
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);
Drawable draw = getResources().getDrawable(id);
draw.setBounds(0, 0, 300, 200);
return draw;
}
};
TextView textfi = (TextView) findViewById(R.id.textfiv);
textfi.append(Html.fromHtml(imgStr, imageGetter, null));
效果如下圖:
右邊的sdfa是通過html來加粗的,下邊的圖片是通過html插入的。