dialog dismiss时键盘不消失的问题浅析及解决办法
程序员文章站
2024-02-19 18:20:34
当setcanceledontouchoutside(true),点击阴影处,dialog dismiss时键盘不消失的问题。
如图
一开始觉得很简单,监听下ond...
当setcanceledontouchoutside(true)
,点击阴影处,dialog dismiss时键盘不消失的问题。
如图
一开始觉得很简单,监听下ondimiss()
方法,在里面隐藏键盘不就行了。
但是发现大多数手机都不会隐藏(魅族x4会隐藏)。
这是为什么呢?为什么键盘不消失呢?
经过测试,发现edittext.getwindowtoken()
为null。
/** * 关闭键盘 * * @param context * @param et */ public static void hidekeyboard(context context, edittext et) { inputmethodmanager imm = (inputmethodmanager) context .getsystemservice(context.input_method_service); logutils.showlog("hidekeyboard imm.isactive() = "+imm.isactive()+" et.getwindowtoken() = "+et.getwindowtoken()); if (imm.isactive()) { imm.hidesoftinputfromwindow(et.getwindowtoken(), 0); } }
这是因为当ondismiss 方法执行的时候,dialog已经消失了。已经获取不到windowtoken了。
目前发现有两种方式觉得这样的问题
1.在ondismiss()方法里面这样隐藏软键盘
@override public void ondismiss(dialoginterface dialog) { inputmethodmanager inputmgr = (inputmethodmanager) context .getsystemservice(context.input_method_service); inputmgr.togglesoftinput(inputmethodmanager.hide_not_always, 0); }
2.在dismiss之前就隐藏软键盘,因为设置setcancelontouchoutside(true),会响应dialog类的ontouch方法。
public boolean ontouchevent(motionevent event) { if (mcancelable && mshowing && mwindow.shouldcloseontouch(mcontext, event)) { cancel(); return true; } return false; } /** * cancel the dialog. this is essentially the same as calling {@link #dismiss()}, but it will * also call your {@link dialoginterface.oncancellistener} (if registered). */ public void cancel() { if (!mcanceled && mcancelmessage != null) { mcanceled = true; // obtain a new message so this dialog can be re-used message.obtain(mcancelmessage).sendtotarget(); } dismiss(); }
重写下ontouch()方法就可以了。代码如下
@override public boolean ontouchevent(motionevent event) { if (isshowing() && shouldcloseontouch(getcontext(),event)){ viewhelper.hidekeyboard(context, et_reply_comment); } return super.ontouchevent(event); } public boolean shouldcloseontouch(context context, motionevent event) { if (event.getaction() == motionevent.action_down && isoutofbounds(context, event) && getwindow().peekdecorview() != null) { return true; } return false; } private boolean isoutofbounds(context context, motionevent event) { final int x = (int) event.getx(); final int y = (int) event.gety(); final int slop = viewconfiguration.get(context).getscaledwindowtouchslop(); final view decorview = getwindow().getdecorview(); return (x < -slop) || (y < -slop) || (x > (decorview.getwidth()+slop)) || (y > (decorview.getheight()+slop)); } // 关闭键盘 public static void hidekeyboard(context context, edittext et) { inputmethodmanager imm = (inputmethodmanager) context .getsystemservice(context.input_method_service); logutils.showlog("hidekeyboard imm.isactive() = "+imm.isactive()+" et.getwindowtoken() = "+et.getwindowtoken()); if (imm.isactive()) { imm.hidesoftinputfromwindow(et.getwindowtoken(), 0); } }
经测试,以上两种方法都可以关闭软键盘。
另外附在dialog启动时弹出软键盘代码,重写onstart方法
@override protected void onstart() { super.onstart(); getwindow().setsoftinputmode(windowmanager.layoutparams.soft_input_state_always_visible); }
以上所述是小编给大家介绍的dialog dismiss时键盘不消失的问题浅析,希望对大家有所帮助