1. 程式人生 > >Android實戰技巧之一 文字與佈局

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);