鍍金池/ 教程/ Android/ 文本與布局
多分辨率適配常用目錄
Android 開發(fā)環(huán)境(Eclipse+ADT+Android 5.0)
Android 原型設(shè)計工具探索
Makefile 快速入門
Android Studio的NDK開發(fā)
人臉檢測-靜態(tài)
getprop 與 dumpsys 命令
Maven 編譯開源二維碼掃描項目 zxing
畫布 Canvas
組合控件
Linux 下的模擬器硬件加速
讀取 Excel
android.hardware.camera2 使用指南
橫豎屏切換
Ubuntu 下切換 JDK 版本
拍照和錄像 with Camera
文本與布局
按鈕控制 ViewPager 的左右翻頁
用 TableLayout 偽裝表格顯示數(shù)據(jù)
Preference Activity 使用詳解
模擬器如何重啟?試試 Genymotion!
獲得屏幕物理尺寸、密度及分辨率
語音識別
了解 native activity
Android Studio 導(dǎo)入第三方類庫、jar 包和 so 庫
啟動另一個 App/apk 中的 Activity
APK 簽名
兩個開源的圖表/報表控件
android studio 導(dǎo)出 jar 包(Module)并獲得手機(jī)信息
圖片的 Base64 編解碼
混淆與反編譯
Android Studio 和 Gradle
Android 5.1 SDK 下載與配置
persistableMode 與 Activity 的持久化
adb 取出安裝在手機(jī)中的 apk
Android Studio 中的源代碼管理
Handler 使用中可能引發(fā)的內(nèi)存泄漏

文本與布局

//別看這個標(biāo)題挺大,其實這次要說的只是3個小技巧。
//2014.11.7 update

1、字符串資源里變量替換

工作中是拒絕硬編碼的,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");

2、TextView 中設(shè)置多種字體大小

這是項目中經(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 就是你想要的。

3、TextView 的超鏈接

這個很簡單,在 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;  
        }  
    }

4、布局中只在界面底部

在大部分的 android 程序中,都會發(fā)現(xiàn)一個底部的菜單欄。這通常是一個線性布局加一些按鈕。如何讓其始終在底部,無論是哪個分辨率呢? 這要用到關(guān)系布局的屬性

    android:layout_alignParentBottom="true"  

在關(guān)系布局內(nèi)部,如果把此屬性設(shè)置 true,就會在關(guān)系布局的底部了。 這個用途還是很廣泛的。

5.EditText 與軟鍵盤

當(dāng)界面有 EditText 并且光標(biāo)落在上面時,軟鍵盤就會彈出。本來是為了方便,但有些情況這樣挺討厭的。比如登錄界面。

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

    <activity   
        android:name=".LoginActivity"  
        android:label="@string/app_name"  
        android:windowSoftInputMode="stateHidden|adjustResize"  
        >  

6.布局的邊框顏色

// 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è)置。

7.Java 文件中字體加粗

    //2015.1.12 update  
    //Typeface  
    textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));  
    //use TextPaint  
    textView.getPaint().setFakeBoldText(true);