日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前提:

當listview的item 中有textview,且textview中內容使用了spannablestring,并且需要點擊事件(如超鏈接等),為textview設置了setMovementMethod。

問題:

這時發現listview的onItemclick無效了,且不是全部無效,而是其中有設置了setMovementMethod的textview的item的點擊失效,未有這種設置的item點擊正常。

網上調查了一番,發現遇到這種問題的人很多,大部分是說由于LinkMovementMethod的OnTouchEvent返回true導致的。這基本上是扯淡,因為item中不僅僅有textview,或者說textview僅僅占item布局的一小部分。如果是OnTouchEvent導致了事件攔截,那么點擊item其他位置應該有效果。測試結果是點擊item任何部分都無效。

雖然網上分析的原因不是真正的原因,但是給出的解決方案基本都可行,大致有以下幾種:

1、重寫textview的OnTouchEvent,處理事件和返回

2、為textview設置OnTouchListener并處理事件和返回

等等。

但是這些前提都是不要為textview設置setMovementMethod,而是在textview的touch事件里自己處理。

這樣比較復雜,那么真正的問題在哪里?問題的根本原因就在setMovementMethod方法里,代碼如下:

public final void setMovementMethod(MovementMethod movement) {if (mMovement != movement) {mMovement = movement;if (movement != null && !(mText instanceof Spannable)) {setText(mText);}fixFocusableAndClickableSettings();// SelectionModifierCursorController depends on textCanBeSelected, which depends on// mMovementif (mEditor != null) mEditor.prepareCursorControllers();} } 可以看到調用了fixFocusableAndClickAbleSettings這個方法,這個方法代碼如下: private void fixFocusableAndClickableSettings() {if (mMovement != null || (mEditor != null && mEditor.mKeyListener != null)) {setFocusable(true);setClickable(true);setLongClickable(true);} else {setFocusable(false);setClickable(false);setLongClickable(false);} }

可以看到當textview設置了movement,會為textview設置獲取焦點、可點擊、可長點擊。
問題就出現在這里,可點擊和可長點擊都正常,但是獲取焦點卻關鍵,因為listview的Item要求布局里的組件不能獲取焦點,因為這樣onItemclick就會失效!

所以問題就是textview設置了movement獲取了焦點,解決方法也很簡單,在設置了setMovementMethod之后為textview在設置取消焦點即可,如下:

tutor.setMovementMethod(LinkMovementMethod.getInstance()); tutor.setFocusable(false); 這樣就既可以正常的textview點擊,而且不影響onItemCLick事件。

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。