项目需求,在一个list中点击某一个item,item中的文字颜色会变化,同时要响应点击事件。
对于文字颜色变化的需求我用selcetor来实现。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/red" android:state_pressed="true" />
<item android:color="@color/red" android:state_focused="true" />
<item android:color="@color/black" />
</selector>
当我点点击一个item时,之前的item就要恢复原始状态,这就需要整个list中有一个互斥变量。我第一个时间想到了focus(也可以自己维护一个专门保存状态的列表,但是我觉得麻烦),设置控件android:focusableInTouchMode="true"和android:focusable="true"之后测试发现,颜色变化效果是可以了,但是没有响应点击事件,要点第二次的时候才响应点击事件。
这样肯定是不行的,解决办法就是监听焦点的变化事件,然后在里面手动触发点击事件。判断的关键就在View#isInTouchMode(),这个方法表示当前是否是触摸模式,如果是触摸模式,控件第一次获得焦点的同事就要响应点击事件
public View.OnFocusChangeListenermOnFocusChangeListener=new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if(hasFocus){
// 如果是touchmode就执行click,否则就会只是选中。
if (view.isInTouchMode()){
view.performClick();
}
}
}
};
如粗依赖我们就可以同时响应焦点和点击事件了。
参考:https://blog.csdn.net/mcryeasy/article/details/53708493
https://blog.csdn.net/jaycee110905/article/details/8240677