1. 程式人生 > >Android實戰技巧之一:文字與佈局(字串變數在資源裡替換)

Android實戰技巧之一:文字與佈局(字串變數在資源裡替換)

//別看這個標題挺大,其實這次要說的只是3個小技巧。

//2014.11.7 update

1、字串資源裡變數替換

工作中是拒絕硬編碼的,Android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.

有些情況是這樣的,程式中要使用的字串如第345頁,345是變數,那麼我們不可能用兩個字串資源如

  1. <stringname="di"></string>
  2. <stringname="page"></string>

在程式中拼接字串。那麼我們可能會想,在我們學習C的時候,有%s這樣的神奇的符號,可以替換變數的格式化操作符。

其實,在android中也有這樣的東西,那就是XLIFF,全稱叫XML本地化資料交換格式,英文全稱XML Localization Interchange File Format。

用法也是很簡單的,如

  1. <stringname="page">第%1$s頁</string>

程式中只要給變數賦值就可以了,如

  1. String page = getString(R.string.page,"345");  
那麼,要是有多個變數呢,如第345頁24行?這也好辦,如下:
  1. <stringname="page">第%1$s頁%2$s行</
    string>
  1. String page = getString(R.string.page,"345","24");  

2、TextView中設定多種字型大小

這是專案中經常遇到的,比如UI是這樣的:

Android實戰技巧之文字與佈局

像這樣的兩種字型,要如何處理呢?需要用到android.text名稱空間下的一些與spannable相關的類和介面。例子如:

  1. String text = "Android實戰技巧之文字與佈局";  
  2. int start = text.indexOf('之');  
  3. int end = text.length();  
  4. Spannable textSpan = new
     Spannable(text);  
  5. textSpan.setSpan(new AbsoluteSizeSpan(20),0,start,Spannable.SPAN_INCLUSIVE_INCLUSIVE);  
  6. 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。例子如下(摘自網路):

  1. publicclass MainActivity extends Activity {  
  2.     private TextView testText;  
  3.     @Override
  4.     protectedvoid onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         testText = (TextView) findViewById(R.id.testText);  
  8.         //將TextView的顯示文字設定為SpannableString
  9.         testText.setText(getClickableSpan());  
  10.         //設定該句使文字的超連線起作用
  11.         testText.setMovementMethod(LinkMovementMethod.getInstance());  
  12.     }  
  13.     //設定超連結文字
  14.     private SpannableString getClickableSpan(){  
  15.         SpannableString spanStr = new SpannableString("使用該軟體,即表示您同意該軟體的使用條款和隱私政策");  
  16.         //設定下劃線文字
  17.         spanStr.setSpan(new UnderlineSpan(), 1620,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    
  18.         //設定文字的單擊事件
  19.         spanStr.setSpan(new ClickableSpan() {  
  20.             @Override
  21.             publicvoid onClick(View widget) {  
  22.                 startActivity(new Intent(MainActivity.this, TestActivity1.class));  
  23.             }  
  24.         }, 1620, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  25.         //設定文字的前景色
  26.         spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 1620,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  27.         //設定下劃線文字
  28.         spanStr.setSpan(new UnderlineSpan(), 2125,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    
  29.         //設定文字的單擊事件
  30.         spanStr.setSpan(new ClickableSpan() {  
  31.             @Override
  32.             publicvoid onClick(View widget) {  
  33.                 startActivity(new Intent(MainActivity.this, TestActivity2.class));  
  34.             }  
  35.         }, 2125, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  36.         //設定文字的前景色
  37.         spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 2125,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  38.         return spanStr;  
  39.     }  
  40. }  

4、佈局中只在介面底部

在大部分的android程式中,都會發現一個底部的選單欄。這通常是一個線性佈局加一些按鈕。如何讓其始終在底部,無論是哪個解析度呢?

這要用到關係佈局的屬性

  1. android:layout_alignParentBottom="true"
在關係佈局內部,如果把此屬性設定true,就會在關係佈局的底部了。

這個用途還是很廣泛的。

5.EditText與軟鍵盤

當介面有EditText並且游標落在上面時,軟鍵盤就會彈出。本來是為了方便,但有些情況這樣挺討厭的。比如登入介面。

取消它只需要在Manifest檔案中使用windowSoftInputMode即可,如下:

  1. <activity
  2.     android:name=".LoginActivity"
  3.     android:label="@string/app_name"
  4.   android:windowSoftInputMode="stateHidden|adjustResize"
  5.     >

6.佈局的邊框顏色

// 2014.11.24 updated

嘗試一下用各種layout仿製listview,就是把layout的邊框設定對應的顏色。

在drawable下新增layer_list,

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <layer-listxmlns:android="http://schemas.android.com/apk/res/android">
  3.   <item>
  4.     <shape>
  5.         <strokeandroid:width="3px"android:color="#ffff0000"/><!--邊框顏色-->
  6.         <solidandroid:color="#FFFCFCFC"/><!--填充色-->
  7.         <cornersandroid:radius="4dp"/><!--圓角-->
  8.     </shape>
  9.   </item>
  10. </layer-list>
在layout中引用:
  1. <LinearLayout
  2.     android:layout_width="match_parent"
  3.     android:layout_height="300dp"
  4.     android:orientation="vertical"
  5.     android:background="@drawable/layout_bg"
  6.     >

//2014.11.27 update 

其他widget如ImageView的邊框也可以像這樣設定。

7.Java檔案中字型加粗

  1. //2015.1.12 update
  2. //Typeface
  3. textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));  
  4. //use TextPaint
  5. textView.getPaint().setFakeBoldText(true);  

相關推薦

Android實戰技巧之一文字佈局(字串變數資源替換)

//別看這個標題挺大,其實這次要說的只是3個小技巧。 //2014.11.7 update 1、字串資源裡變數替換 工作中是拒絕硬編碼的,Android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.

Android實戰技巧之一 文字佈局

                //別看這個標題挺大,其實這次要說的只是3個小技巧。//2014.11.7 update1、字串資源裡變數替換工作中是拒絕硬編碼的,android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.有些情況是這樣的,程

Android Gradle 技巧之一 Build Variant 相關

Build Variant android gradle 外掛,允許對最終的包以多個維度進行組合。 BuildVariant = ProductFlavor x BuildType 兩個維度 最常見的就是這樣: productFlavors { pro { }

ORA-01861文字格式字串不匹配錯誤解決

在oracle中修改時間或是插入時間報錯誤: 此類錯誤為你修改或是插入的資料型別和資料的不一樣; 解決格式化你的方法: update  表名 set  欄位 = to_date('2016/11/10 14:50:15','yyyy/mm/dd hh24:mi:ss');

Android實戰技巧之四十Android5.1.1原始碼編譯燒寫

購買Nexus手機的朋友大多是為了自己修改系統玩,再加上其較高的價效比,在開發者中還是廣受歡迎的。我的5太子被我升級到了6.0預覽版,玩的正嗨,捨不得換回到5.1時代了。不過鑑於距6.0原始碼釋出還有段日子,5.1的原始碼編譯與燒寫仍是主流,下面就記錄了整個過程

Android實戰技巧之三十八Handler使用中可能引發的內存泄漏

sha 指向 ons har 引用 destroy 對象 from weak 問題描寫敘述 曾幾何時,我們用原來的辦法使用Handler時會有以下一段溫馨的提示: This Handler class should be static or le

Android列表用法之一實戰簡單ListView

ListView這個列表控制元件,是我們在開發當中使用頻率比較高的一個控制元件。 既然是使用頻率比較高,那麼我們就有必要將它的使用方式儲存,方便以後直接複製貼上,把注意力放在架構上面,不用經常做程式碼搬運工(重複搬運)。 當然Android的API也提供了許多建立ListView介面卡的快

Android實戰技巧之四十九Usb通訊之USB Host

零 USB背景知識 USB是一種資料通訊方式,也是一種資料匯流排,而且是最複雜的匯流排之一。 硬體上,它是用插頭連線。一邊是公頭(plug),一邊是母頭(receptacle)。例如,PC上的插座就是母頭,USB裝置使用公頭與PC連線。 目前USB硬體介面

Android實戰技巧ViewStub的應用

       在開發應用程式的時候,經常會遇到這樣的情況,會在執行時動態根據條件來決定顯示哪個View或某個佈局。那麼最通常的想法就是把可能用到的View都寫在上面,先把它們的可見性都設為View.GONE,然後在程式碼中動態的更改它的可見性。這樣的做法的優點是邏輯簡單而且

Android實戰技巧之九最新Android開發環境(Eclipse+ADT+Android 5.0)

一、一切由執行時錯誤引起dalvikvm Could not find class '引用包.類', referenced from method... 其實在編譯時也會見到如下錯誤:       [dx]        [dx] trouble processing:   

Android實戰技巧之三十五瞭解native activity

1.native activity的意義 很多人覺得Android的Fwk提供的支援足夠好了,既然Google不推薦用Ndk開發為什麼又放寬Ndk的限制而推出可以無Java開發Android App呢?我的理解是不同的技術實現會有其適合的場景。 Ndk的適用

Android實戰技巧用TextView實現Rich Text---在同一個TextView中設定不同的字型風格

背景介紹 在開發應用過程中經常會遇到顯示一些不同的字型風格的資訊猶如預設的LockScreen上面的時間和充電資訊。對於類似的情況,可能第一反應就是用不同的多個TextView來實現,對於每個TextView設定不同的字型風格以滿足需求。 這裡推薦的做法是使用android

Android實戰技巧之二十一Android原型設計工具探索

移動開發者、移動產品經理和互動設計師在有了產品的想法後會做出一系列的草圖,然後反覆推敲改進,直到自己滿意。這個草圖就是原型設計,是產品設計初期很重要的工作,它是產品的雛形,之後會以此為原型進行開發。 當移動網際網路熱度增加後,一些主打移動原型設計的工具如雨後春

BS開發技巧之一利用Textarea實現長文字域的輸入

問題提出:   在BS模式下,開啟瀏覽器對文擋進行編輯操作時,如果一個文字域原來的內容很多,大大超過當前域的輸入框,那麼如果需要對這個域的內容進行修改時,要找到對應修改的字眼會顯得很麻煩。 解決思路:   模擬RTF域的輸入模式。 解決辦法:   假使待處理域為FieldA。

Android實戰技巧之三十七圖片的Base64編解碼

通常用Base64這種編解碼方式將二進位制資料轉換成可見的字串格式,就是我們常說的大串,10塊錢一串的那種,^_^。 Android的android.util包下直接提供了一個功能十分完備的Base64類供我們使用,下面就演示一下如何將一張圖片進行Base64

Android實戰技巧之四十 Android5 1 1原始碼編譯燒寫

                     購買Nexus手機的朋友大多是為了自己修改系統玩,再加上其較高的價效比,在開發者中還是廣受歡迎的。我的5太子被我升級到了6.0預覽版,玩的正嗨,捨不得換回到5.1時代了。不過鑑於距6.0原始碼釋出還有段日子,5.1的原始碼編譯與燒寫仍是主流,下面就記錄了整個過程(持續

Android自定義佈局系列之一流式佈局(含TextView的點選事件)

前言:   之前寫了Unity優化方面的文章,之後就沒寫了。之後想把C盤擴大點,室友試了分割槽助手,很好用,也成功了,我心動也試了下,以為不會出什麼意外,更不會出現資料丟失,抱著僥倖的心理沒臨時備份,哎!沒想到最重要的E盤(所有資料)裡所有資料都丟失了,之後用了資料恢復,

Android實戰技巧為從右向左語言定義複雜字串,程式碼和xml設定

程式碼方式,一般是放在一個Utils.java作為公共方法 /// add by xxx.zhou for ArabicRTL support 20141024 begin public static boolean isContainEG_I

Android實戰技巧之二十八啟動另一個App/apk中的Activity

Android提供了在一個App中啟動另一個App中的Activity的能力,這使我們的程式很容易就可以呼叫其他程式的功能,從而就豐富了我們App的功能。比如在微信中傳送一個位置資訊,對方可以點選這個位置資訊啟動騰訊地圖並導航。這個場景在現實中作用很大,尤其是朋

Android實戰技巧元件間通訊---Intent和IntentFilter

Understanding Intent and IntentFilter--理解Intent和IntentFilter Intent(意圖)在Android中是一個十分重要的元件,它是連線不同應用的橋樑和紐帶,也是讓元件級複用(Activity和 Service)成為可能的