原始内容发布于本人OSC博客,现已迁移至此。


    最近项目上遇到Contacts新建联系人时,输入框没有默认焦点,输入法也没默认弹出。
    客户反馈需要有默认焦点,输入法也要默认弹出,于是问题来了…..
    首先默认焦点好弄,如果是xml布局文件,直接在布局中EditText的节点内部,插入标签就好了,如下面:

    1. <EditText
    2. android:id="@+id/editText"
    3. android:layout_width="wrap_content"
    4. android:layout_height="wrap_content"
    5. android:layout_above="@+id/button"
    6. android:layout_alignEnd="@+id/scrollView"
    7. android:layout_alignParentStart="true">
    8. <requestFocus />
    9. </EditText>

    但坑爹的是这里不是xml布局,输入框都是代码动态插进去的……
    不过这也不难,代码里面调用EditText.requestFocus();一般就可以获取焦点了。
    我们知道,一般情况下输入框默认有焦点时,输入法就会自动弹出来了,但这里又来了一个坑,输入法并没有自动弹出来。
    没弹出来,我们代码控制弹出来就好了噜,码代码:

    1. InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    2. imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);//用SHOW_FORCE也可以,具体区别请自行百度。

    结果编译完,push进去,擦,还是没弹出来,瞬间懵逼……
    反复检查也没发现写错,叫来同事也没有搞明白肿么回事,个个懵逼……
    最后谷哥出一个方法,使用延时弹出,也就是说,Activity显示出来之后,并不立即调用上面的代码直接弹输入法,而是延时一段时间再弹。
    代码如下:

    1. private void showInputMethod(final Context context, final View view, final long delay) {
    2. Timer timer = new Timer();
    3. timer.schedule(new TimerTask() {
    4. @Override
    5. public void run() {
    6. InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    7. imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    8. }
    9. }, delay); // 如果这里的时间太短,可能出现输入法弹不出来的情况。
    10. }

    这里一开始查到的delay=1000ms,觉得太长了点,换成了500ms,编译push,运行,也弹不出来……
    继续懵逼……
    最后无奈试了下1000ms,居然弹出来了,然后问了群里的大神,有人解释说可能是一开始弹出输入法受到了干扰,但具体是什么原因也搞不明白……
    Mark一下这个坑,以免后面再次碰到,继续懵逼……


    另一个延迟方法:
    image.png