TextView是我們經常使用的元件之一,
今天要來說如何讓你的 TextView 去自動判斷 內容是電話、Email、網址......等。
判斷之後當然就可以點擊 並且作相對的事件 Ex:點擊號碼就跳到撥打電話那邊。
實現的方法有兩種,並分別作介紹。
首先 效果圖:
方法一:
Layout 部分:
Layout的部分很簡單,就是拉4個TextView就可以了
text_view__auto_link.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".TextView_AutoLinkActivity" > <TextView android:id="@+id/txt_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="(03)4583333" /> <TextView android:id="@+id/txt_web" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txt_phone" android:layout_below="@+id/txt_phone" android:text="http://tw.yahoo.com" /> <TextView android:id="@+id/txt_email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txt_web" android:layout_below="@+id/txt_web" android:text="abc@yahoo.com.tw" /> <TextView android:id="@+id/txt_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txt_email" android:layout_below="@+id/txt_email" android:layout_marginTop="30dp" android:text="0912345678\nabc@yahoo.com.tw\nhttp://tw.yahoo.com" /> </RelativeLayout>
接下來是 java的部分:
TextView_AutoLinkActivity:
package com.example.textview_autolink; import android.app.Activity; import android.os.Bundle; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.widget.TextView; public class TextView_AutoLinkActivity extends Activity { private TextView txt_web, txt_phone, txt_email, txt_all; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.text_view__auto_link); // 尋找元件ID txt_web = (TextView) findViewById(R.id.txt_web); txt_phone = (TextView) findViewById(R.id.txt_phone); txt_email = (TextView) findViewById(R.id.txt_email); txt_all = (TextView) findViewById(R.id.txt_all); // 設定連結 txt_web.setAutoLinkMask(Linkify.WEB_URLS); txt_phone.setAutoLinkMask(Linkify.PHONE_NUMBERS); txt_email.setAutoLinkMask(Linkify.EMAIL_ADDRESSES); txt_all.setAutoLinkMask(Linkify.ALL); // 如果要生效,那麼加入以下代碼 txt_web.setMovementMethod(LinkMovementMethod.getInstance()); txt_phone.setMovementMethod(LinkMovementMethod.getInstance()); txt_email.setMovementMethod(LinkMovementMethod.getInstance()); txt_all.setMovementMethod(LinkMovementMethod.getInstance()); } }
這樣就完成了,接下來說方法二,比方法一更簡單許多!
方法二:
方法二非常簡單,只需要在Layout在創見TextView的時候多加上一行指令就好了,完全不會使用到Java那邊
android:autoLink="all" //或是選擇你需要的 android:autoLink="web|email|phone"
例如:
<TextView android:id="@+id/txt_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txt_phone" android:autoLink="all" android:layout_below="@+id/txt_phone" android:text="http://tw.yahoo.com" />
因為比較簡單,就不列出Layout所有的程式碼了。
接下來,如果你使用的是模擬器,可能在點擊E-mail的連結時,發生應用程式停止的情況,如下圖。
會發生這個原因是因為使用者沒有安裝發送Email相關的軟體,
解決方法如下,當找不到Email的程式的時候,我們需要攔截這個startActivity
程式碼如下:
// 如果沒有郵件系統處理方法 // 參考http://www.cnblogs.com/angeldevil/archive/2013/12/22/3485871.html @Override public void startActivity(Intent intent) { /** * Java - IndexOf 和 lastIndexOf 用法 lastIndexOf(char ch) * 可以找尋某字串中,最後一次出現ch字元的位置。位置的起始由0開始 如果字串中找不到該字元,則會回傳-1 */ if (intent.toString().indexOf("mailto") != -1) { // Any way to judge that this is to sead an email PackageManager pm = getPackageManager(); // The first Method List activities = pm.queryIntentActivities(intent, 0); if (activities == null || activities.size() == 0) { // Do anything you like, or just return return; } } super.startActivity(intent); }
記得,不管是使用方法一、方法二,都要加入以上程式碼,來避免用戶當機的機會唷!
最後附上方法一的原始檔(Mega):https://mega.co.nz/#!RM41GZaZ!LSWqChlOiUjsMuoCsDKPwTKoY6ErvWIz7KMrqA6P8vI
全站熱搜