由如何将EditText失去焦点在首次加载时的思考
先说解决方法吧:
前提,在非EditText的任意View中添加
1 android:focusable="true" 2 android:focusableInTouchMode="true"
分支1. 然后在添加上面的View中 添加<RequestFocus />标签,然后就可以啦。
有人说必须要在首个EditText前面。这个我没证实,有兴趣的朋友可以试试~
分支2.在代码中添加
1 yourEditText.clearFocus(); 2 yourFouceView.requestFocus();
用分支2的朋友发现。。。。没效果啊。你个XXX骗我啊。
其实少一点点。正确代码在下面:
1 new Handler().post(new Runnable() { 2 3 @Override 4 public void run() { 5 yourEditText.clearFocus(); 6 yourFocusView.requestFocus(); 7 } 8 });
然后"神奇"的可以了哦。
为啥这样是可以的?目前我没有看源码,下面说说我的想法:
1.上面的Handler是创建在main thread的,故调用也在main thread.
2.目前并不清楚softinput是什么时候添加到windows中并显示的,但是我知道最后显示给用户的时候必然加载ok了。
3.在2的前提下,我把代码放到onWindowFocusChanged(boolean)中。
4.但是发现也不行,或许在onWindowFocusChange之后才根据focus显示键盘。
5.从4上看上去咱的路被堵了。但是!这时肯定会把显示键盘的行为加入到处理队列中了。因为这是在界面呈现给用户之前给程序猿最后的机会。
6.所以将clearFocus的行为加入到处理队列中。嘿嘿。run一下果然没问题。
7.为啥还有7。问题不都解决了么。 其实,这时候思考一下。其实上面肯定不是最佳的solution.取了巧
虽然不清楚focus显示键盘行为的流程,无论他将这个行为在主线程直接执行,还是通过消息队列在主线程执行,还是通过异步处理主线程显示。
只要我们在它执行这个行为之后再执行cleanFocus行为。就可以跳过这个未知,来解决问题。
而且是不是非得在onWindowFocusChange里面执行?未必,但是最保险的是在这里。
8.为啥还有8.都说是引发的思考了。
在ScrollView中,大家都会遇到smoothScroll、scrollTo没效果啊。也可以用这个的方法解决。外面加一个post。
至于为啥:目前没时间研究了,不过当解析啊布局啊都ok了。我在scrollTo一下。肯定没问题。
9.上面胡乱写的,违反了严谨性,是取巧行为,大家不要学。