解决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无效的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android魔法(第二弹)——一步步实
- 下一篇: 减小TabLayout高度而不影响每个t