Dialog和软键盘在屏幕上的并存问题:
最近做添加门店,门店昵称自动根据文字变化去搜索后台数据,但是一搜索软键盘就关闭了,感觉用户体验不太好。一开始根本不知道啥问题,找了半天才发现是网络请求dialog加载导致软件盘隐藏的,后面直接把dialog给注释掉了。忙的做项目没时间查资料。今天网上搜了一下,有其他解决办法,通过人家贴的源码才知道。不得感叹一下:关键时刻还是源码好使啊!
首先说下结论: 
1.AlertDialog和ProgressDialog默认可以和系统软键盘并存与同意屏幕(其实质是并存于同一个window窗口,具体下面会解释) 
2.Dialog以及用户自定义的继承自Dialog的弹出框默认不可以和软键盘并存与同一屏幕
我遇到的就是第二种情况还是对底层不太熟悉,根本不知道啥问题,检查代码都没问题,最后只能把dialog注释掉不显示,浪费好多时间,如果想dialog和软件盘并存的话
2.1Dialog对象设置
Dialog di = new Dialog(MainActivity.this);
    di.setTitle("test   test");
    di.getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
2.2自定义继承自Dialog对象的设置
public class LoadingDialog extends Dialog {
                            ...
        }
    loadDialog = new LoadingDialog(this, R.style.dialog);
    loadDialog.getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
那么为什么会这样,还是对本质不了解
Activity是什么?Dialog是什么?软键盘的实质是什么?他们三个和Window窗口的关系是什么?
通过网上查看解释源码得知:
Acitvity的布局是添加在所创建的window窗口中的
dialog需要创建一个属于自己的window窗口
然而软键盘的实质就是一个自定义的Dialog
由于软键盘也是一个自定义dialog,那么实质上就是我们的自定义dialog和软键盘的并存关系了。
最终结论:由于dialog是依附于window窗口存在的,所以是由window的属性控制dialog和软键盘的显示。 
dialog中源码注释已经说明如果需要dialog显示在软键盘之上,就需要为window添加FLAG_ALT_FOCUSABLE_IM这个属性。我们通过继承Dialog自定义的弹出窗口也需要为他们所在的window设置这个属性才可以和软键盘并存。
by 郝金刚
Dialog和软键盘在屏幕上的并存问题:的更多相关文章
- Android 显示Dialog的同时自动弹出软键盘;
		
需求大致就是这样的:用户点击按钮弹出Dialog,Dialog中有输入框,然后Dialog弹出后要自动弹出软键盘:(如果让用户自己手动点击输入框再弹出软键盘的话,用户体验太差了): 好的,需求大致就是 ...
 - Ionic3学习笔记(九)关于 Android 端软键盘弹出后界面被压缩的问题
		
本文为原创文章,转载请标明出处 今天做了一个如下图所示的页面. iOS 端毫无 bug,Android 端却出现了问题.当软键盘弹出后,Android 端的 tabs 移到了软键盘的上面,再仔细一看, ...
 - edittext把软键盘上的回车键改为搜索、发送或者 下一步,窗口随软键盘弹出而改变。
		
http://m.blog.csdn.net/article/details?id=51350501 以上博文讲解很详细. 如图所示,有时候为了布局美观,在搜索时没有搜索按钮,而是调用软件盘上的按钮. ...
 - 隐藏软键盘(解决自定义Dialog中无法隐藏的问题)
		
/** * Dialog中隐藏软键盘不管用 * @param activity */ public static void HideSoftKeyBoard(Activity activity){ t ...
 - ios上有时候提交按钮点击两次才可以取消输入框软键盘
		
ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出 ...
 - 从键盘输入一个字符串(长度不超过30),统计字符串中非数字的个数,并将统计的结果显示在屏幕上,用EXE格式实现。
		
问题 从键盘输入一个字符串(长度不超过30),统计字符串中非数字的个数,并将统计的结果显示在屏幕上,用EXE格式实现. 源程序 data segment hintinput db "plea ...
 - 解决appium点击软键盘上的搜索按钮
		
在执行appium自动化测试的时候,需要点击软件盘上的搜索按钮. 具体操作步骤如下: 前提:需要事先安装搜狗输入法 1.唤醒软件盘,可以封装到一个类里,用到的时候随时调用. import os#调起s ...
 - form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】和【前进】进行提交操作
		
[文章来源]由于自己对于form研究甚少,所以一直用的都是AJAX进行提交,这次后台提出要用form提交,顺便深入研究一下:之前在做表单的时候,发现input可以通过设置不同的type属性,调用不同的 ...
 - 小米note3,华为手机,软键盘弹出之后,页面上定位的元素布局会乱掉
		
原因:可能是因为,软键盘弹出时,改变了height,使height:100%,不能达到原来的高度. 解决办法: $(document).ready(function () { $('body').he ...
 
随机推荐
- python单元测试用例
			
demo1.py #!/usr/bin/python # encoding: utf-8 def hello(): print "i am in demo1" def add(x, ...
 - Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment
			
1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...
 - Go语言之并发编程(三)
			
Telnet回音服务器 Telnet协议是TCP/IP协议族中的一种.它允许用户(Telnet客户端)通过一个协商过程与一个远程设备进行通信.本例将使用一部分Telnet协议与服务器进行通信. 服务器 ...
 - easyui-combogrid必填为空时无法通过表单验证的问题
			
在使用easyui-combogrid时,由于html解析出的格式是如下三层: <td> <input id="txcombo" class="easy ...
 - 66、fastJson 解析json数据时,如果key值不同怎么处理?
			
在某些场景,你可能需要定制序列化输出,比如说,希望序列化采用之后采用"ID",而不是"id",你可以使用@JSONField这个Annotation. publ ...
 - gcc学习记录2——多输入文件
			
首先有两个.c文件:circle.c和circulararea.c. 分别对两个源文件生成目标文件,circle.o和circulararea.o. gcc -c circle.c circularr ...
 - Java学习4之抽象类
			
在面向父类编程的过程中,抽象出来的父类具有一般化特质.父类函数只是一个抽象化的概念,只是为了在面向对象编程时统一接口服务. example: 有时父类会定义出一些无法实现的行为: public voi ...
 - sqlserver 表值函数
			
一.单语句表值函数 ALTER function [dbo].[uf_get_jxc_da_sum](@dt char(8),@dt2 char(8)) RETURNS table as return ...
 - mvc-自定义视图引擎
			
//自定义视图引擎的实质是把数据模型(moudle)和模板(View)转换成html页面,输出到客户端public class MyView:IView { string _viewPath; pub ...
 - c++面试须知
			
这些都是从zhihu上看到的. 指针,多态(虚函数表.内存layout),作用域,内存的管理 算法与数据结构,数据结构上由掌握哈希.优先级队列,算法上有字符串处理,简单的DFS.BFS.动态规划 系统 ...