TextView 藉助Linkify,使用自定義模式設置連接

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以及自定義模式了。

相關文章
相關標籤/搜索