//別看這個標(biāo)題挺大,其實這次要說的只是3個小技巧。
//2014.11.7 update
工作中是拒絕硬編碼的,android 里會把一些字符串等放在 xml 中當(dāng)做資源使用,如項目中 values 下的 strings.xml 列出了 app_name. 有些情況是這樣的,程序中要使用的字符串如第345頁,345是變量,那么我們不可能用兩個字符串資源如
<string name="di">第</string>
<string name="page">頁</string>
在程序中拼接字符串。那么我們可能會想,在我們學(xué)習(xí) C 的時候,有 %s 這樣的神奇的符號,可以替換變量的格式化操作符。
其實,在 android 中也有這樣的東西,那就是 XLIFF,全稱叫 XML 本地化數(shù)據(jù)交換格式,英文全稱 XML Localization Interchange File Format。
用法也是很簡單的,如
<string name="page">第%1$s頁</string>
程序中只要給變量賦值就可以了,如
String page = getString(R.string.page,"345");
那么,要是有多個變量呢,如第345頁24行?這也好辦,如下:
<string name="page">第%1$s頁%2$s行</string>
String page = getString(R.string.page,"345","24");
這是項目中經(jīng)常遇到的,比如 UI 是這樣的:
Android 實戰(zhàn)技巧之文本與布局
像這樣的兩種字體,要如何處理呢?需要用到 android.text 命名空間下的一些與 spannable 相關(guān)的類和接口。例子如:
String text = "Android實戰(zhàn)技巧之文本與布局";
int start = text.indexOf('之');
int end = text.length();
Spannable textSpan = new Spannable(text);
textSpan.setSpan(new AbsoluteSizeSpan(20),0,start,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(12),start,end,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
這個 textSpan 就是你想要的。
這個很簡單,在 xml 中屬性 autoLink=“all”。
程序中 TextView.setAutoLink(Linkify.ALL);
說下參數(shù):
Linkify.EMAIL_ADDRESS -- 僅識別出 TextView 中的 Email 在址,標(biāo)識為超鏈接,點擊后會跳到 Email,發(fā)送郵件給此地址
Linkify.PHONE_NUMBERS -- 僅識別出 TextView 中的電話號碼,標(biāo)識為超鏈接,點擊后會跳到 Dialer,Call 這個號碼
Linkify.WEB_URLS-- 僅識別出 TextView 中的網(wǎng)址,標(biāo)識為超鏈接,點擊后會跳到 Browser 打開此 URL
Linkify.ALL -- 這個選項是識別出所有系統(tǒng)所支持的特殊 Uri,然后做相應(yīng)的操作
特殊情況:
當(dāng)一段文字部分是超鏈接或者我們需要點擊超鏈接跳到另一個 Activity時,如何處理?
答案還是用 Spannable。例子如下(摘自網(wǎng)絡(luò)):
public class MainActivity extends Activity {
private TextView testText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testText = (TextView) findViewById(R.id.testText);
//將TextView的顯示文字設(shè)置為SpannableString
testText.setText(getClickableSpan());
//設(shè)置該句使文本的超連接起作用
testText.setMovementMethod(LinkMovementMethod.getInstance());
}
//設(shè)置超鏈接文字
private SpannableString getClickableSpan(){
SpannableString spanStr = new SpannableString("使用該軟件,即表示您同意該軟件的使用條款和隱私政策");
//設(shè)置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 16, 20,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent (MainActivity.this, TestActivity1.class));
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 16, 20,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 21, 25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, TestActivity2.class));
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 21, 25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
}
在大部分的 android 程序中,都會發(fā)現(xiàn)一個底部的菜單欄。這通常是一個線性布局加一些按鈕。如何讓其始終在底部,無論是哪個分辨率呢? 這要用到關(guān)系布局的屬性
android:layout_alignParentBottom="true"
在關(guān)系布局內(nèi)部,如果把此屬性設(shè)置 true,就會在關(guān)系布局的底部了。 這個用途還是很廣泛的。
當(dāng)界面有 EditText 并且光標(biāo)落在上面時,軟鍵盤就會彈出。本來是為了方便,但有些情況這樣挺討厭的。比如登錄界面。
取消它只需要在 Manifest 文件中使用 windowSoftInputMode 即可,如下:
<activity
android:name=".LoginActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateHidden|adjustResize"
>
// 2014.11.24 updated
嘗試一下用各種 layout 仿制 listview,就是把 layout 的邊框設(shè)置對應(yīng)的顏色。
在drawable下添加layer_list,
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<stroke android:width="3px" android:color="#ffff0000" /><!--邊框顏色-->
<solid android:color="#FFFCFCFC" /><!--填充色-- >
<corners android:radius="4dp" /><!--圓角-->
</shape>
</item>
</layer-list>
在 layout 中引用:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:background="@drawable/layout_bg"
>
//2014.11.27 update
其他 widget 如 ImageView 的邊框也可以像這樣設(shè)置。
//2015.1.12 update
//Typeface
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
//use TextPaint
textView.getPaint().setFakeBoldText(true);