需求大致就是这样的:用户点击按钮弹出Dialog,Dialog中有输入框,然后Dialog弹出后要自动弹出软键盘;(如果让用户自己手动点击输入框再弹出软键盘的话,用户体验太差了);

好的,需求大致就是这样;很简单嘛Dialog.show();后手动打开软键盘就可以了嘛;

第一次尝试,代码是这样的:

InputPwdDialog inputPwdDialog = new InputPwdDialog(context, Gravity.CENTER,R.layout.item_dialog2);
inputPwdDialog.show();
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
// 如果软键盘在窗口上已经显示,则隐藏,反之则显示
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

好神奇,软键盘竟然没有弹出来;

重新尝试:没关系,这次使用强制打开软键盘的方法;

InputPwdDialog inputPwdDialog = new InputPwdDialog(context, Gravity.CENTER,R.layout.item_dialog2);
inputPwdDialog.show();
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
// 强制显示软键盘,view为当前的输入框对象
inputMethodManager.showSoftInput(inputPwdDialog.findViewById(R.id.v),InputMethodManager.SHOW_FORCED);

showSoftInput();第一个参数是当前输入框的对象;但是!!!在Dialog中无效;还是没有软键盘弹出;

嗯,不要气馁,仔细想一想感觉软键盘可能也是一种Dialog,两个Dialog同时弹出会不会有什么冲突;

第三次重新尝试:在Dialog显示完成之后再去弹出软键盘;

InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog);
inputPwdDialog.show();
inputPwdDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
});

呵呵哒,软键盘还是没有自动弹出;

那这样呢,第四次重新尝试!

InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog);
inputPwdDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(300);
runOnUiThread(new Runnable() {
@Override
public void run() {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}); }
}).start();

开启一个子线程睡眠300ms(我Dialog有个动画200ms),然后在主线程中弹出软键盘;这次软键盘弹出来了,真的在Dialog弹出后自动弹出来了;

欣喜之余总感觉用这种开启线程延迟弹出不太好;

好的,我要放大招了!!!

<!--带输入框-->
<style name="inputDialog" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowFrame">@android:color/transparent</item><!-- 边框 -->
<item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowBackground">@android:color/transparent</item><!-- 自己想要的背景 -->
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
<item name="android:windowSoftInputMode">stateAlwaysVisible</item><!--显示软件盘-->
</style>

给你的Dialog自定义个样式就OK了。

网上有说使用Handler弹出软键盘的;

示例代码:

private final int BOND = 1;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case BOND:
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
break;
}
} };
InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog);
inputPwdDialog.show();
handler.sendEmptyMessageDelayed(BOND,100);

也可以使用,Dialog就是使用Handler来控制隐藏和显示的;但是!!!不加延迟发送消息时,偶尔会出现自动弹出后又自动隐藏了。加上延迟发送消息后,第一次总是不自动弹出;

总结一下:

延迟弹出软键盘和自定义Dialog样式都可以弹出软键盘;那种更好自己试试就知道了;

Android 显示Dialog的同时自动弹出软键盘;的更多相关文章

  1. Android PopupWindow中EditText获取焦点自动弹出软键盘

    公司的项目中要求在点击搜索的时候弹出一个搜索框,搜索框中有一个EditText,用于数据搜索关键字,要求在弹出PopupWindow的时候自动弹出软键盘,原以为只要写上着两行代码可以搞的问题: Inp ...

  2. Android进入页面开始就自动弹出软键盘

    EditText edittext = (EditText)findViewById(R.id.edittext);   edittext.setFocusable(true);   edittext ...

  3. 自定义dialog自动弹出软键盘

    1.解决无法弹出输入法: 在show()方法调用之前,用dialog.setView(new EditText(context))添加一个空的EditText,由于是自定义的AlertDialog,有 ...

  4. android开发中防止刚进入activity时edittext获取焦点,自动弹出软键盘

    刚进入activity的时候,如果布局组件有edittext的话,往往edittext会获取焦点,自动弹出软键盘,影响整个界面的视觉效果.解决方法如下:   可以在edittext的父布局结构中(例如 ...

  5. android开发中防止刚进入activity时edittext获取焦点,防止自动自动弹出软键盘

    刚进入activity的时候,如果布局组件有edittext的话,往往edittext会获取焦点,自动弹出软键盘,影响整个界面的视觉效果.解决方法如下: 可以在edittext的父布局结构中(例如Li ...

  6. [转]android自动弹出软键盘(输入键盘)

    转自:http://www.devdiv.com/home.php?mod=space&uid=65729&do=blog&id=11847 很多应用中对于一个界面比如进入搜索 ...

  7. android自动弹出软键盘(输入键盘)

        很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: [代 ...

  8. Android 自动弹出软键盘(输入键盘)

    很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: EditTe ...

  9. popupwindow中EditText获取焦点后自动弹出软键盘

    关于popupwindow中EditText获取焦点后自动弹出软键盘的问题,玩过手机qq或空间的童鞋应该知道,再点击评论时会弹出一个编辑框,并且伴随软键盘一起弹出是不是很方便啊,下面我们就来讲一下实现 ...

随机推荐

  1. 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search

    起因 也是 前几天 有 网友 在 群 里发了   知识图谱   相关的文章, 还有 有 网友 问起   NLog -> LogStash -> Elastic Search  的 问题, ...

  2. 手动制作openstack windows镜像

    https://docs.openstack.org/image-guide/windows-image.html 这里以 windows 2008为例: 准备工作: 1准备好windows 2008 ...

  3. maven默认本地仓库

    本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库.这样在你下次使用的时候就不需要从远程下载了.如果你所需 ...

  4. Centos Java环境(转)

    https://jingyan.baidu.com/article/d7130635e6118213fdf47589.htm 解压jdk的安装包.   将解压后的文件夹重命名,便于后续操作(非必需) ...

  5. IndexR

    IndexR是由舜飞科技研发的实时OLAP系统.于 2017 年 1 月初正式开源,目前已经更新至 0.6.1 版本,其作者认为IndexR具有以下特点: 超大数据集,低查询延时(超大数据集由HDFS ...

  6. Python Flask 构建微电影视频网站

    前言 学完本教程,你将掌握: 1.学会使用整形.浮点型.路径型.字符串型正则表达式路由转化器 2.学会使用post与get请求.上传文件.cookie获取与相应.404处理 3.学会适应模板自动转义. ...

  7. Windows Azure Web Site (18) Azure Web App设置MIME

    <Windows Azure Platform 系列文章目录> 在笔者之前的文章中,介绍了我们在使用Azure Web App,可以把静态资源保存到Azure Storage中: Wind ...

  8. svn项目清除svn链接信息

    如果copy的项目原来有svn连接信息,测试新技术新方案时可能会有隐患,不小心上传svn很造成很多麻烦. 这时先删除svn连接是比较好的选择. 删除svn的方法是删除项目根目录下的.svn文件夹.这个 ...

  9. C++进阶--显式类型转换(casting)

    //############################################################################ /* * 显式类型转换 * * 类型转换 ...

  10. Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)

    一.js中的词法作用域和动态作用域      词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了.       js中其实只有词法作用域,并没有动态作用域,this的执 ...