Android Dialog中软键盘的显示与隐藏的示例
程序员文章站
2023-12-19 13:53:22
1.写在前面
本篇的主要内容是关于在dialog中软键盘的显示与隐藏问题,需求是在dialog中有一个密码输入框,弹出dialog显示软键盘,关闭dialog隐藏软键盘。...
1.写在前面
本篇的主要内容是关于在dialog中软键盘的显示与隐藏问题,需求是在dialog中有一个密码输入框,弹出dialog显示软键盘,关闭dialog隐藏软键盘。
嗯,是不是有点简单,不过在实现的过程中还是遇到了一些问题,在试过了网上大部分的方法之后,最终找到了一个还不错的方法,分享给大家。
看下效果图:
2.实现过程
先说说最开始的实现方法:
// 显示dialog dialog.show(); // 显示软键盘 softinpututils.showsoftinput(activity);
but,软键盘并没有显示,显示软键盘有两种方法,使用的是第一种方法,第二种方法在dialog中没有效果。
// 第一种,如果软键盘在窗口上已经显示,则隐藏,反之则显示 inputmethodmanager inputmethodmanager = (inputmethodmanager) activity.getsystemservice(context.input_method_service); inputmethodmanager.togglesoftinput(0, inputmethodmanager.hide_not_always); // 第二种,强制显示软键盘,view为当前的输入框对象 inputmethodmanager.showsoftinput(view,inputmethodmanager.show_forced);
于是查看dialog的源码,发现dialog的显示和隐藏是通过handler来处理的,会不会是显示软键盘的方法执行的太快了,于是在show方法后延时显示软键盘,发现是可以正常显示的。
但是延时处理这种方法显然不太好,有没有一种dialog显示完成后就能回调的方法呢,嗯,有的,setonshowlistener方法,在onshowlistener接口的回调方法onshow中显示软键盘就可以了。软键盘的隐藏并没有这些限制,在dismiss之后隐藏,或者在回调方法ondismiss中隐藏都可以。
/** * 发送显示dialog的消息 */ private void sendshowmessage() { if (mshowmessage != null) { // obtain a new message so this dialog can be re-used message.obtain(mshowmessage).sendtotarget(); } } /** * 接收显示或隐藏dialog的消息 */ private static final class listenershandler extends handler { private weakreference<dialoginterface> mdialog; public listenershandler(dialog dialog) { mdialog = new weakreference<dialoginterface>(dialog); } @override public void handlemessage(message msg) { switch (msg.what) { case dismiss: ((ondismisslistener) msg.obj).ondismiss(mdialog.get()); break; case cancel: ((oncancellistener) msg.obj).oncancel(mdialog.get()); break; case show: ((onshowlistener) msg.obj).onshow(mdialog.get()); break; } } }
延时显示软键盘
new thread() { @override public void run() { super.run(); activity.runonuithread(new runnable() { @override public void run() { softinpututils.showsoftinput(activity); } }); } }.start();
3.代码
显示dialog提示框
public class dialogutils { private static dialog dialog; /** * dialog提示框消失方法 */ public static void dialogdismiss() { if (isdialogshowing()) { dialog.dismiss(); dialog = null; } } /** * dialog提示框是否正在运行 * * @return dialog提示框是否正在运行 */ public static boolean isdialogshowing() { return dialog != null && dialog.isshowing(); } /** * 创建dialog提示框 * * @param context 上下文 */ private static void createdialog(context context) { dialogdismiss(); dialog = new dialog(context, r.style.sampletheme); dialog.setcontentview(r.layout.layout_dialog); // 点击弹窗外区域,弹窗不消失 dialog.setcanceledontouchoutside(false); } /** * 显示确认安全码提示框 * * @param activity 当前activity * @param dialogonclicklistener 确定按钮点击事件 */ public static void showsecuritycodeinputdialog(final activity activity, final dialogonclicklistener dialogonclicklistener) { createdialog(activity); imageview ivclose = (imageview) dialog.findviewbyid(r.id.iv_close); final gridpasswordview gpvcode = (gridpasswordview) dialog.findviewbyid(r.id.gpv_code); button btnok = (button) dialog.findviewbyid(r.id.btn_ok); ivclose.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { dialogdismiss(); } }); btnok.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { string code = gpvcode.getpassword(); dialogonclicklistener.onclick(code); } }); dialog.setonshowlistener(new dialoginterface.onshowlistener() { @override public void onshow(dialoginterface dialog) { // 获取焦点 gpvcode.requestfocus(); // 显示软键盘 softinpututils.showsoftinput(activity); } }); dialog.setondismisslistener(new dialoginterface.ondismisslistener() { @override public void ondismiss(dialoginterface dialog) { // 隐藏软键盘 softinpututils.hidesoftinput(activity); } }); dialog.show(); } public interface dialogonclicklistener { /** * 点击事件 * * @param str 回调参数 */ public void onclick(string str); } }
显示和隐藏软键盘的方法
public class softinpututils { /** * 显示软键盘,dialog使用 * * @param activity 当前activity */ public static void showsoftinput(activity activity) { inputmethodmanager inputmethodmanager = (inputmethodmanager) activity.getsystemservice(context.input_method_service); inputmethodmanager.togglesoftinput(0, inputmethodmanager.hide_not_always); } /** * 隐藏软键盘 * * @param activity 当前activity */ public static void hidesoftinput(activity activity) { inputmethodmanager inputmethodmanager = (inputmethodmanager) activity.getsystemservice(context.input_method_service); inputmethodmanager.hidesoftinputfromwindow( activity.getwindow().getdecorview().getwindowtoken(), 0); } }
调用显示dialog的方法
dialogutils.showsecuritycodeinputdialog(this, new dialogutils.dialogonclicklistener() { @override public void onclick(string str) { toast.maketext(mainactivity.this, str, toast.length_short).show(); dialogutils.dialogdismiss(); } });
4.写在最后
在频繁的显示、关闭dialog的测试中发现,有时软键盘不会显示,但是没有找到规律,有了解的同学可以给我留言评论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。