相信做过Android开发的同学,都曾经遇到过系统输入法不按照你的想法弹出的情况。那今天我们就来聊聊windowSoftInputMode这个东西吧!
首先,系统定义的windowSoftInputMode共有9种分别是:stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
1:stateUnspecified 就是默认状态,这个属性处于此状态的时候。系统会根据自己的需要来判断是否需要显示输入法。1:如果界面没有需要输入的文本框时,不会弹出。2:有需要输入的文本框,在文本框获取焦点,同时外面包裹Scroll的时候,会自动弹出。这个属性是一个比较难判断准确得属性。
2:stateUnchange 这个属性,软键盘弹出的取决因素是上一个界面的键盘状态。
3:stateHidden 如果Activity是通过启动来显示的,那么使用此状态,键盘不管之前的状态,都会隐藏。但如果是从ActivityTask由于上一个Activity死亡,导致显示的话,会使用默认属性。
4:stateAlwaysHidden 跟StateHidden的区别是无论是通过什么方式显示的Activity都会隐藏软键盘。
5:stateVisible 此属性与stateHidden流程相同,效果相反。
6:stateAlwaysVisible 无论如何都会弹出软键盘
7:adjustUnspecified 如果界面没有ScrollView,那么覆盖软键盘部分的内容,但保证需要输入的部分被顶到上面保证可以看到输入的内容。如果有ScrollView ScrollView会调整大小,从而可以随意滚动,展示所有内容
8:adjustResize 如果没有ScrollView 在覆盖部分的内容, 并不会被顶上去,依然是不可见的。如果有ScrollView ScrollView会调整大小,从而可以随意滚动,展示所有内容
9:adjustPan 如果没有ScrollView 与默认效果相同,如果有ScrollView ScrollView不会调整大小,不可以滚动。
windowSoftInputMode属性就说到这里。下面我们来看一些常见问题。
情况一:当显示的页面有输入框,同时又ScrollView的时候。
在这种情况下,当进入这个页面的时候,软键盘会自动弹出。如果不想自动键盘弹出,这个时候你可以设置属性如下:
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
情况二:当显示页面有输入框,同时下方有Button,外层还包裹了ScrollView时,比如注册登录页面。如果有点击EditText时,让SCrollView滑动到Button可以点击。
要解决这种需求,需要为EditText添加TouchListener。在点击时,让本页面的ScrollView滑动到底部,关键代码如下:
public void scrollToBottom() {
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
register_scroll.fullScroll(ScrollView.FOCUS_DOWN);
verificationCodeEdit.setFocusable(true);
verificationCodeEdit.setFocusableInTouchMode(true);
verificationCodeEdit.requestFocus();
verificationCodeEdit.findFocus();
}
},200);
注意,为何此处要添加EditText获取焦点的代码呢,因为ScrollView滑动,有时候会影响到本页面内获取焦点的EditText。
同时,handler的延时跟各种手机也有一定的关系,具体值,请自行测试
情况三:隐藏系统弹出的键,
方法1:设置EditText的InputT代码如下:
private class My_Edit_TouchListener implements View.OnTouchListener{
private EditText mEdit;
public My_Edit_TouchListener(EditText edit){
mEdit = edit;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int inputType= mEdit.getInputType();
mEdit.setInputType(InputType.TYPE_NULL);
mEdit.setFocusable(true);
mEdit.setFocusableInTouchMode(true);
mEdit.requestFocus();
mEdit.findFocus();
mEdit.setCursorVisible(true);
mEdit.onTouchEvent(event);
mEdit.setInputType(inputType);
return true;
}
}
将EditText的InputType设置为InputType.TYPE_NULL在EditText设置为这个属性时,软键盘无论如何都不会出来了.
方法2:利用InputMethodManager
InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
关于软盘的显示,隐藏规则,就先记这么多吧!