1、在ListView或者RecyclerView中,item里的EditView无法打开键盘
需求是这样的,左滑点击item上的一个按钮后进行编辑,然而一直弹不出键盘。
发现是在item的根布局下加了如下代码:
android:descendantFocusability = "blocksDescendants"
删掉就好啦
descendantFocusability 直译是后代聚焦能力的意思,所以字段是控制父控件与子控件的聚焦能力的。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
一开始代码中写的blocksDescendants,当然会拦截掉子view的焦点啦。当然不同情况还要具体分析,这个属性只是一个分析点。
2、键盘无法隐藏的灵异事件:
有这么个隐藏键盘的方法:
protected void hideSoftInputFromWindow( View view, Context context) {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0)
}
发现调用了没什么用,然后在有些页面又很灵,有些页面又不灵。搜了半天也为这里flag写错了,一直都没什么用。
其实,在有些页面复杂一些,包含了列表控件,当调用隐藏键盘的方法时,被页面的大量刷新操作阻塞了,导致隐藏没有生效,有效的方法是延时调用此方法,让一拨主线程的任务先过去,再来触发效果很好。
在开发其他功能也是如此,比如有时候发现弹框偶尔弹不出来,可能就是类似问题,主线程执行的任务太多,阻塞住了,都可以同样的思路解决。这告诉我们,虽然都是主线程中干的活,也扛不住一次执行太多,不如少执行一点,多来几个循环。
网友评论