一、输入法的显示和隐藏
1、配置 进入页面自动显示输入法
AndroidManifest.xml 中配置windowSoftInputMode属性
android:windowSoftInputMode="adjustPan|stateVisible"
该属性主要影响两件事情:
【一】当有焦点产生时,软键盘是隐藏还是显示
【二】是否减少活动主窗口大小以便腾出空间放软键盘
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间。主布局可能出现压缩变形。
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。主布局会自动上移,导航栏也会移出显示区域。
2、手动显示和隐藏输入法
(1)方式一:
显示输入法:showSoftInput
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(ed_editTextView,InputMethodManager.SHOW_FORCED);
隐藏输入法:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(ed_editTextView.getWindowToken(),0);
(2)方式二
使用toggleSoftInput() 来切换 输入的显示和隐藏:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
二、EditText多行显示,并且监听键盘的回车键按下动作。
在做项目的过程中 可能会遇到这样的需求:点击EditText弹出输入法,用户可以输入多行能容,点击回车键,将用户输入内容进行采集,隐藏软键盘,并将信息发送出去(如微信聊天页面 输入文本消息,进行发送操作)
1、尝试一:
(1)配置EditText:
<android:id="@+id/ed_editTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:imeOptions="actionSend"
android:inputType="textMultiLine"
/>
(2)为EditText设置setOnEditorActionListener,检测用户点击回车键的动作
ed_editTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public
boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED || actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
ed_editTextView.clearFocus();
Log.d("111","检测到回车键");
}
return true;
}
});
注意:
一定要设置 android:inputType="textMultiLine" 和 android:imeOptions="actionSend" 才能监听到 setOnEditorActionListener 回车事件
如上的用法,在搜狗输入法下 可以完美的实现 多行输入,同时监听回车按键,但是切换成Android系统自带的输入法或这其他输入法后,按下输入法回车键,动作只是换行,并不触发setOnEditorActionListener 监听回调。
2、尝试2:
原来这是EditText 的限制,在inputType = textMultiLine 时,点击回车键的默认操作就是换行,不会有其他的事件触发。只有将inputType = text 或者限定为singleline 单行输入时 才能监听到额外的事件
于是转换思路:将EditText设置为单行输入,监听输入法回车事件,同时想办法 让输入内容大于EditText宽度时自动换行。
(1)设置EditView为单行输入
<android:id="@+id/ed_editTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:imeOptions="actionSend"
android:inputType="text"
/>
(2)初始化EditView时 设置起 自动换行
ed_editTextView = (EditText) findViewById(R.id.ed_editTextView); ed_editTextView.setMaxLines(Integer.MAX_VALUE); ed_editTextView.setHorizontallyScrolling(false);
(3)设置 setOnEditorActionListener,监听 回车事件
ed_editTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public
boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED || actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
ed_editTextView.clearFocus();
Log.d("111","检测到回车键");
}
return true;
}
});
参考文章:https://www.jianshu.com/p/701fb57269d0