由如何将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.上面胡乱写的,违反了严谨性,是取巧行为,大家不要学。

posted @ 2013-05-27 17:58  wFeng  阅读(687)  评论(0)    收藏  举报