處理點擊隱私政策,後邊空白區域觸發了點擊事件

本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!前端

最近公司在用戶登陸界面要加《用戶協議》以及《隱私政策》,話還沒等產品說完,我就想到了用 SpannableString 作,提及來簡單,固然,作起來也簡單,以前作app都會有這種需求,此次字比較多,一行展現不完,如圖1,2,不過這不要緊,而後我就提給測試測了,過了會,剛要伸懶腰,測試過來講有問題,爲啥點空白區域也會進隱私政策的界面,很納悶,我測的時候沒問題啊(原來是隻點了字的,尷尬),那就改唄,因而踏上英雄的征途。java

image.png 圖1 image.png 圖2android

英雄的征途大體分爲四個階段

第一階段:遇到問題;第二階段:尋找問題; 第三階段:解決問題;第四階段:把這個解決問題方法分享給你們。後端

第一階段:遇到問題

點擊空白區域也能觸發點擊事件markdown

第二階段:尋找問題

經過SpannableString 雖然設置好了,可是還差點擊事件的響應,若是不加下面這行代碼,那麼點擊事件是沒有用的,因此問題出如今了這,以下圖: image.png 那就看源碼吧,LinkMovementMethod類,點擊事件確定經過onTouchEvent方法實現,下圖圈起來的,在特定的條件下會計算出錯致使的,這裏的特定條件有兩種狀況:app

第一種:當你的TextView寬度設置爲android:layout_width="wrap_content"而且存在換行時;ide

第二種:當你的TextView寬度設置爲android:layout_width="match_parent"而且沒有填滿TextView時工具

image.png

第三階段:解決問題

<string name="privacy_policy">《隱私政策》&#160;</string>佈局

注意:由於加了空格,因此別忘了減1,以下圖:post

image.png

第四階段:把這個解決問題方法分享給你們

如下是所有代碼:方便你們搬磚愉快。

  1. string裏定義名字
    <string name="login_consent">登陸註冊即代表您已閱讀並贊成</string>
    <string name="user_service">《用戶服務協議》&#160;</string>
    <string name="privacy_policy">《隱私政策》&#160;</string> 
    複製代碼
  2. xml佈局
<TextView
            android:id="@+id/tv_agreement"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="20dp"
            />
複製代碼
  1. 登陸協議工具類
/** * @author Created by JasonYin * Description:協議工具類 */
class LoginAgrementView(private val activity: Activity, private val tvArrgement: TextView) {
    /** * 用戶協 */
    fun useAgrement() {
        tvArrgement.text = activity.getString(R.string.login_consent)
        val clickString = SpannableString(activity.getString(R.string.user_service))
        clickString.setSpan(ForegroundColorSpan(Color.parseColor("#FFFFFF")), 0, clickString.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        clickString.setSpan(object : ClickableSpan() {
            override fun onClick(widget: View) {
                Log.e("---> $", "用戶協議")
            }

            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.color=ContextCompat.getColor(activity, R.color.blue)
                ds.isUnderlineText = false
            }
        }, 0, clickString.length - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        tvArrgement.append(clickString)
        tvArrgement.append(SpannableString("和"))
        val clickStringPrivacy = SpannableString(activity.getString(R.string.privacy_policy))
        clickStringPrivacy.setSpan(object : ClickableSpan() {
            override fun onClick(widget: View) {
                Log.e("---> $", "隱私政策")
            }

            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.color=ContextCompat.getColor(activity, R.color.blue)
                ds.isUnderlineText = false
            }
        }, 0, clickStringPrivacy.length - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        tvArrgement.append(clickStringPrivacy)
        //開始響應點擊事件
        tvArrgement.movementMethod = LinkMovementMethod.getInstance()
    }

}
複製代碼
  1. 代碼裏引用
LoginAgrementView(this, mBinding.tvProtocol).useAgrement()
複製代碼
相關文章
相關標籤/搜索