最近修改一个功能,EditText一开始默认不获焦点,等点击Edittext的时候,再获得焦点并弹软键盘。
按照常规操作,
一开始在代码中设置Edittext没有焦点:
tv_subject.clearFocus();
当它需要焦点的时候,让其获取焦点:
tv_subject.setFocusable(true);
tv_subject.setFocusableInTouchMode(true);
tv_subject.requestFocus();
tv_subject.requestFocusFromTouch();
//需要光标闪动
tv_subject.setCursorVisible(true);
然后调用弹出软键盘的代码。
发现没有效果!
后面根据网上的一些说法,又尝试了下面的做法,不行!
tv_subject.postDelayed(new Runnable() {
@Override
public void run() {
tv_subject.setFocusable(true);
tv_subject.setFocusableInTouchMode(true);
tv_subject.requestFocus();
tv_subject.requestFocusFromTouch();
}
},500);
总之软键盘就是死活不出来!
后面终于找到了原因,原来是在EditText的某一层根布局中有这样一个属性:
android:descendantFocusability="blocksDescendants"
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
原来是上层的控件直接就已经将焦点给抢走了,才会导致软键盘弹不出来!