先记录问题:
如图,其实很简单点击评论回复别人的弹窗悬浮于键盘之上。点击其他地方回复原装,输入法和回复框消失。实现模式 是PopupWindow来实现的,
可是问题出现了,点击其他地方 悬浮窗消失了 输入键盘一直还在。
这个封装好的三年前 都在用了一直很好用,突然想不明白这是为什么。
本来是换一种解决思路:点击页面其他地方 隐藏 输入法,结果是 各种隐藏输入法方式均无效
并且警告:
W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.
已经被处理,那么可能是其他的因素想到了windowSoftInputMode属性,该页面在manifest中该页面windowSoftInputMode是如此定义的:
android:windowSoftInputMode="stateHidden|adjustResize"
回头看了三年前的项目没有声明android:windowSoftInputMode。
改为stateAlwaysHidden,起效。是这个属性引起的,只好在复习一遍了。
本着求是的精神,认真复习:
android:windowSoftInputMode属性一共有9个取值,分别是:
stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
设置属性的时候,可以在这9个值里面选择一个,也可以用"state...|adjust"的形式进行设置。
前6个是页面
1.stateUnspecified
中文意思是未指定状态,在没有设置android:windowSoftInputMode属性时,默认值,只有输入框获取焦点,会弹出。
2 stateUnchanged
不改变的意思,当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。
3.stateHidden用户选择activity时,软键盘总是被隐藏
4.stateAlwaysHidden
当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
5.stateVisible
软键盘通常是可见的,即使在界面上没有输入框的情况下也可以强制召唤
6.stateAlwaysVisible:
用户选择activity时,软键盘总是显示的状态。
stateVisible与stateAlwaysVisible不同之处。
如果设置A界面为stateVisible属性,如果当前的A界面键盘是显示的,跳转到下个界面B的时候,软键盘会因为输入框失去焦点而隐藏,这是返回A界面,键盘这个时候是隐藏的。
如果设置A为stateAlwaysVisible,当前的A界面键盘是显示键盘,跳转到下个界面B,软键盘被隐藏的,这时候返回A界面,软键盘是会显示出来。
stateAlwaysVisible:不管什么情况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。
以下三个 是页面显示内容和输入法软键盘位置关系
7.adjustUnspecified
默认设置,通常由系统自行决定是隐藏还是显示。系统会根据界面选择不同的模式,如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容。
8.adjustResize
根据字面意思Resize,重新调整大小,即总是调整屏幕的大小以便留出软键盘的空间。
对于有滑动控件的布局来说,显示效果和默认adjustUnspecified是一样的
对于没有滑动控件的布局,默认属性时,整个布局是被顶上去,设置为adjustResize属性,布局的位置并没有发生什么变化。
9.adjustPan
当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。
对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。
不设置"adjust..."的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式.
stateVisible与stateAlwaysVisible不同之处。stateAlwaysHidden与stateHidden类似,选择stateAlwaysHidden,always一直隐藏输入法。