原因
清除focus其实包含2个部分的操作:
清除当前View的focus标志,并且清除它的祖先节点中存储的mFocus信息
调用DecorView的requestFocus()方法,重新寻找一个View,并将其设置为focus
requestFocus()都是以先序遍历的方式,找到第一个focusInTouchMode的View,并将其设置为焦点
所以,之所以有时候发现EditText.clearFocus()无效,是因为:清除focus之后,还会按照先序遍历的顺序查找一个focusInTouchMode的View,并将其设置为focus,而你的EditText恰好是这第一个符合条件的View。(因此不是没清除成功,而是清除了之后,又给设置上了)
解决办法
知道了原因之后,解决就很简单了。找一个在EditText之前的View,将其设置为可获得焦点的
代码中
View.setFocusableInTouchMode(true)
或在布局中
android:focusableInTouchMode="true"
如果不知道怎样找到一个在EditText之前的View的话,可以直接选择它的parent (xxxLayout)