Android提供了windowSoftInputMode属性来控制输入法软键盘窗口与主Activity窗口的交互,分为窗口大小调整系列和输入法软键盘显示控制系列。窗口大小调整系列:这一系列参数用来控制Activity主窗口在软键盘弹出时的调整策略,因为如果不调整主窗口,当前输入的控件可能会被软键盘挡住.adjustPan:Activity的主窗口不会调整大小为输入法腾出空间,但是窗口的内容会自动上下晃动,保证当前获得焦点的控件不会被键盘挡住,然后用户可以看到他们输入的内容。与adjustResize模式相比,它不是很令人满意,因为用户必须关闭输入法才能与被输入法遮挡的控件进行交互。adjustResize:Activity的主窗口将调整大小以为输入法腾出空间。adjustUnspecified:当前模式没有明确指定Activity使用adjustPan或者adjustResize,系统会自动选择一个模式。选择结果是如果当前ActivityWindow中有可以滚动自身内容的控件,比如ScrollView,那么选择结果就是adjustResize。因为它认为滚动可以让Window的内容即使在很小的范围内也可见。Activity的默认模式就是这种模式。adjustNoting:活动的窗口没有改变。两种模式下屏幕-主窗口-主窗口内容-软键盘的关系如下:具体效果如下:无滚动内容,adjustPan:无滚动内容,adjustResize:无滚动内容,adjustUnspecified==adjustPan有滚动内容(ScrollView),adjustPan有滚动内容(ScrollView),adjustResize有滚动内容(ScrollView),adjustUnspecified==adjustResize输入法软键盘显示控制系列:这一系列参数用来控制当一个东西包含Window(Activity,Dialog等)显示在屏幕上前端软键盘的显示或隐藏策略。stateUnspecified:系统根据当前具体情况选择相应的模式。stateUnchanged:软键盘保持之前的状态(之前的Activity或Dialog在屏幕最前端时软键盘的状态),不改变,无论之前的状态是显示还是隐藏。stateHidden:当用户主动进入当前界面时,软键盘隐藏。离开上一界面,返回当前界面,不能算作“主动进入”。被动进入时,保持之前的状态。stateAlwaysHidden:只要用户进入界面,软键盘就会隐藏,无论是主动进入(新启动界面)还是被动进入(离开上一界面,返回当前界面)。stateVisible:当用户主动进入当前界面时,显示软键盘。离开上一界面,返回当前界面,不能算作“主动进入”。被动进入时,保持之前的状态。stateAlwaysVisible:只要用户进入界面,就会显示软键盘,无论是主动进入(新启动界面)还是被动进入(离开上一个界面,返回当前界面)。关于一些华为手机的bug今天遇到了一个bug。是这样的。在部分华为手机上,除了第一次点击输入框外,adjustPan参数会生效(软键盘可以正常弹出输入框),后面从第二次开始,无论怎么点击,adjustPan参数无效。布局模型大致如下:
