原始内容发布于本人OSC博客,现已迁移至此。
最近项目上遇到Contacts新建联系人时,输入框没有默认焦点,输入法也没默认弹出。
客户反馈需要有默认焦点,输入法也要默认弹出,于是问题来了…..
首先默认焦点好弄,如果是xml布局文件,直接在布局中EditText的节点内部,插入
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button"
android:layout_alignEnd="@+id/scrollView"
android:layout_alignParentStart="true">
<requestFocus />
</EditText>
但坑爹的是这里不是xml布局,输入框都是代码动态插进去的……
不过这也不难,代码里面调用EditText.requestFocus();一般就可以获取焦点了。
我们知道,一般情况下输入框默认有焦点时,输入法就会自动弹出来了,但这里又来了一个坑,输入法并没有自动弹出来。
没弹出来,我们代码控制弹出来就好了噜,码代码:
InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);//用SHOW_FORCE也可以,具体区别请自行百度。
结果编译完,push进去,擦,还是没弹出来,瞬间懵逼……
反复检查也没发现写错,叫来同事也没有搞明白肿么回事,个个懵逼……
最后谷哥出一个方法,使用延时弹出,也就是说,Activity显示出来之后,并不立即调用上面的代码直接弹输入法,而是延时一段时间再弹。
代码如下:
private void showInputMethod(final Context context, final View view, final long delay) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}, delay); // 如果这里的时间太短,可能出现输入法弹不出来的情况。
}
这里一开始查到的delay=1000ms,觉得太长了点,换成了500ms,编译push,运行,也弹不出来……
继续懵逼……
最后无奈试了下1000ms,居然弹出来了,然后问了群里的大神,有人解释说可能是一开始弹出输入法受到了干扰,但具体是什么原因也搞不明白……
Mark一下这个坑,以免后面再次碰到,继续懵逼……
另一个延迟方法: