Android實戰技巧之一 文字與佈局
//別看這個標題挺大,其實這次要說的只是3個小技巧。
//2014.11.7 update
1、字串資源裡變數替換
工作中是拒絕硬編碼的,android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.
有些情況是這樣的,程式中要使用的字串如第345頁,345是變數,那麼我們不可能用兩個字串資源如
<string name="di">第</string><string name="page">頁</string>
在程式中拼接字串。那麼我們可能會想,在我們學習C的時候,有%s這樣的神奇的符號,可以替換變數的格式化操作符。
其實,在android中也有這樣的東西,那就是XLIFF,全稱叫XML本地化資料交換格式,英文全稱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");
2、TextView中設定多種字型大小
這是專案中經常遇到的,比如UI是這樣的:
Android實戰技巧之文字與佈局
像這樣的兩種字型,要如何處理呢?需要用到android.text名稱空間下的一些與spannable相關的類和介面。例子如:
String text = "Android實戰技巧之文字與佈局";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就是你想要的。3、TextView的超連結
這個很簡單,在xml中屬性autoLink=“all”。
程式中TextView.setAutoLink(Linkify.ALL);
說下引數:
Linkify.EMAIL_ADDRESS -- 僅識別出TextView中的Email在址,標識為超連結,點選後會跳到Email,傳送郵件給此地址
Linkify.PHONE_NUMBERS -- 僅識別出TextView中的電話號碼,標識為超連結,點選後會跳到Dialer,Call這個號碼
Linkify.WEB_URLS-- 僅識別出TextView中的網址,標識為超連結,點選後會跳到Browser開啟此URL
Linkify.ALL -- 這個選項是識別出所有系統所支援的特殊Uri,然後做相應的操作
特殊情況:
當一段文字部分是超連結或者我們需要點選超連結跳到另一個Activity時,如何處理?
答案還是用Spannable。例子如下(摘自網路):
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的顯示文字設定為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, TestActivity1.class)); } }, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設定文字的前景色 spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 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, TestActivity2.class)); } }, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設定文字的前景色 spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 21, 25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spanStr; }}
4、佈局中只在介面底部
在大部分的android程式中,都會發現一個底部的選單欄。這通常是一個線性佈局加一些按鈕。如何讓其始終在底部,無論是哪個解析度呢?
這要用到關係佈局的屬性
android:layout_alignParentBottom="true"
在關係佈局內部,如果把此屬性設定true,就會在關係佈局的底部了。這個用途還是很廣泛的。
5.EditText與軟鍵盤
當介面有EditText並且游標落在上面時,軟鍵盤就會彈出。本來是為了方便,但有些情況這樣挺討厭的。比如登入介面。
取消它只需要在Manifest檔案中使用windowSoftInputMode即可,如下:
<activity android:name=".LoginActivity" android:label="@string/app_name" android:windowSoftInputMode="stateHidden|adjustResize" >
6.佈局的邊框顏色
// 2014.11.24 updated
嘗試一下用各種layout仿製listview,就是把layout的邊框設定對應的顏色。
在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的邊框也可以像這樣設定。
7.Java檔案中字型加粗
//2015.1.12 update//TypefacetextView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));//use TextPainttextView.getPaint().setFakeBoldText(true);