解决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
        // mMovement
        if (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事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BennuCTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值