在TextView
中建立可點擊連結的極為簡單的方法。
在為 Twitter 創建 Talon 時,我遇到的最困難的事情之一就是根據特定文字建立這些可點擊的連結。幸運的是,我讓任何人都可以輕鬆地將這種類型的樣式應用到他們的TextView
中。
與所有大玩家的做法類似(Google+、Twitter、咳爪咳),這個函式庫可讓您為TextView
中的任何String
組合建立可點擊的連結。
TextView
中特定單字的長按和短按操作String
或使用正規表示式將可點擊連結設定為符合該模式的任何文本與TextView
的自動連結功能相比,使用此程式庫的主要優點是您可以連結任何內容,而不僅僅是網址、電子郵件和電話號碼。它還提供顏色自訂和觸控回饋。
有兩種方法可以使用該函式庫:
這是首選方式。只需添加:
dependencies {
compile ' com.klinkerapps:link_builder:2.0.5 '
}
新增到您的專案依賴項並執行gradle build
或gradle assemble
。
下載原始程式碼並將其作為庫專案匯入到 Eclipse 中。該項目位於資料夾庫中。有關如何執行此操作的更多信息,請閱讀此處。
功能可以在 Kotlin 範例的 MainActivity 中找到。對於 Java,請檢查 JavaMainActivity。
有關我在 Talon 中使用的正則表達式列表,您可以訪問此處
// Create the link rule to set what text should be linked.
// can use a specific string or a regex pattern
Link link = new Link ( "click here" )
. setTextColor ( Color . parseColor ( "#259B24" )) // optional, defaults to holo blue
. setTextColorOfHighlightedLink ( Color . parseColor ( "#0D3D0C" )) // optional, defaults to holo blue
. setHighlightAlpha ( .4f ) // optional, defaults to .15f
. setUnderlined ( false ) // optional, defaults to true
. setBold ( true ) // optional, defaults to false
. setOnLongClickListener ( new Link . OnLongClickListener () {
@ Override
public void onLongClick ( String clickedText ) {
// long clicked
}
})
. setOnClickListener ( new Link . OnClickListener () {
@ Override
public void onClick ( String clickedText ) {
// single clicked
}
});
TextView demoText = ( TextView ) findViewById ( R . id . test_text );
// create the link builder object add the link rule
LinkBuilder . on ( demoText )
. addLink ( link )
. build (); // create the clickable links
您也可以建立CharSequence
而不是直接建立連結並將其套用到TextView
。套用CharSequence
後,不要忘記在TextView
上設定移動方法,否則連結將無法點擊。
// find the text view. Used to create the link builder
TextView demoText = ( TextView ) findViewById ( R . id . test_text );
// Add the links and make the links clickable
CharSequence sequence = LinkBuilder . from ( this , demoText . getText (). toString ())
. addLinks ( getExampleLinks ())
. build ();
demoText . setText ( sequence );
// if you forget to set the movement method, then your text will not be clickable!
demoText . setMovementMethod ( TouchableMovementMethod . getInstance ());
如果您想要設定連結的預設文字顏色,而不需要在每個Link
物件上手動輸入,則可以從活動主題中進行設定。
< style name = " LinkBuilderExampleTheme " parent = " android:Theme.Holo.Light " >
< item name = " linkBuilderStyle " >@style/LinkBuilder</ item >
</ style >
< style name = " LinkBuilder " >
< item name = " defaultLinkColor " >#222222</ item >
< item name = " defaultTextColorOfHighlightedLink " >#444444</ item >
</ style >
該庫是基於 Kotlin 構建的,因此您可以使用一些擴展方法將連結應用到TextView
,而不是創建構建器。
val demo = findViewById< TextView >( R .id.demo_text)
demo.applyLinks(link1, link2, .. .)
demo.applyLinks(listOfLinks)
預設情況下, LinkBuilder
將消耗TextView
上的所有觸控事件。這意味著如果您嘗試實作ListView.OnItemClickListener
將永遠不會被呼叫。解決此問題的方法是在佈局中實作LinkConsumableTextView
而不是普通的 TextView。
如果您單擊了TextView
中的鏈接,我的LinkConsumableTextView
將僅消耗觸控事件。否則,它將把觸控事件推遲到父級,這允許您使用ListView.OnItemClickListener
方法。
請分叉此儲存庫並使用拉取請求做出貢獻。可以使用問題來請求功能。非常感謝所有程式碼、評論和批評。
可以在此處找到該程式庫的完整變更日誌。
Copyright 2015 Luke Klinker
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.