TextView是android中的一個比較經常使用的控件,它有一個很是有趣的特性,能夠經過android:autoLink設置某些模式,使得textView文本中匹配這個模式的文本段成爲可點連接。android默認支持的模式有:web,email,phone,map以及它們的組合。 java
例如: android
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:autoLink="web" android:text="helle baidu:www.baidu.com jflsjf" />因爲設置了該TextView的autoLink屬性爲web,所以文本text中的www.baidu.com將會顯示爲可點擊的連接。當用戶點擊了該鏈接,android會建立一個Intent(內容爲一個Uri,http://www.baidu.com)而且將它傳給startActivity方法,來啓動可以處理http模式的activity。
除了使用默認的web等模式以外,咱們還能夠經過Linkify類的addLinks方法來添加自定義模式。 web
例如,咱們能夠自定義一個模式 mm:// app
TextView的xml定義以下: ide
<TextView android:id="@+id/cus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="www.baidu.com abc def g mm://abcd gg" />
在Java代碼中爲其設置自定義模式: spa
private TextView customLinkify; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customLinkify = (TextView) findViewById(R.id.cus); Pattern p = Pattern.compile("mm://\\S*"); Linkify.addLinks(customLinkify, p, "mm"); }運行結果以下:
能夠看到「mm://abcd」已經變爲可點擊狀態,可是此時點擊該連接時,會拋出異常,由於android並無找到能夠處理mm://模式的activity。能夠添加一個簡單的MmActivity來處理這種模式: code
首先,在AndroidManifest文件中註冊一下: xml
<activity android:name=".MmActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <!--隱式調用時,必須聲明DEFAULT種類,不然Android不會啓動該Activity--> <category android:name="android.intent.category.DEFAULT" /> <!--聲明可以處理模式mm://--> <data android:scheme="mm" /> </intent-filter> </activity>而後在MmActivity中就能夠獲取相應信息了
Intent i = getIntent(); Uri uri = i.getData(); System.out.println(uri);//結果爲 mm://abcd
其實在上面的圖上能夠看到,www.baidu.com並無被識別爲連接(由於咱們沒有設置web模式)。須要注意的是,當須要使自定義模式和內置模式web,phone等一塊兒被識別時,必定要先聲明內置模式,而後再聲明自定義模式,並且不能在xml中經過autoLink屬性聲明,不然自定義模式不起做用。由於在設置內置模式時,會先刪除已有模式。 get
將上面的Java代碼改成: string
private TextView customLinkify; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customLinkify = (TextView) findViewById(R.id.cus); Pattern p = Pattern.compile("mm://\\S*"); Linkify.addLinks(customLinkify, Linkify.WEB_URLS); Linkify.addLinks(customLinkify, p, "mm");//這一句必定要在後面 }如今就能夠同時識別web以及自定義模式了。