当界面有edittext获取焦点并且弹出软键盘时,需要实现点击back返回键直接结束当前页面时,可以重写Edittext的onKeyPreIme方法
当我们点击顶部的输入框,然后弹出底部的输入键盘这种情况很常见,当我们点击back键的时候,首先是输入框消失,接下来有两种情况,如果我想在输入框消失的时候顶部的搜索框消失或者是不消失,那我们该怎么做呢?我这里介绍的方法是自定义EditText,然后拦截返回事件,代码如下:
public class SafeEditText extends EditText
{
public SafeEditText(Context context) {
super(context);
}
public SafeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SafeEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode==KeyEvent. KEYCODE_BACK){
if (listener!=null){
listener.onKeyBack();
return true;
}
}
return super.onKeyPreIme(keyCode, event);
}
private OnEditTextKeyBackListener listener;
public void setOnEditTextKeyBackListener(OnEditTextKeyBackListener listener){
this.listener =listener;
}
public interface OnEditTextKeyBackListener{
void onKeyBack();
}
}
如何调用:
mSearchEditText = (SafeEditText ) view.findViewById(R.id.search_bar_edit_text);
mSearchEditText.setOnEditTextKeyBackListener(new SafeEditText.OnEditTextKeyBackListener() {
@Override
public void onKeyBack() {
hideSoftInput();
setResultFromCity();
}
});
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
public void hideSoftInput() {
if (mInputMethodManager != null) {
View v = this.getCurrentFocus();
if (v == null) {
return;
}
mInputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
// mSearchView.clearFocus();
}
onkeyPriIme 这个方法可以用来拦截按键事件,典型的是处理back键,更新UI,如果不重写这个方法,那么IME就会默认处理键盘(通常都是键盘消失)。
顺带记录相关的知识点:
IM(Input Method): 输入法。是指通过键盘等输入设备输入 输入设备上没有 的字符的 方法/程序/处理器 。最开始是特指在拉丁字母键盘上输入CJK (Chinese, Japanese and Korean)文字的方法,现在一般将所有的输入语言字符的方式都统称为输入法。
IME(Input Method Editor): 输入法编辑器。通常简作输入法。
IMF(input method framework): 输入法框架。
输入法样式的控制
android:inputType
我们可以根据文本框要输入数据的类型(邮箱、手机号、密码、时间…)告诉系统我们更想显示哪种类型的输入法键盘(type可以多个配合使用,使用”|”连接起来)。如android:inputType="phone"系统就优先显示数字键盘以便输入手机号。
android:imeOptions
我们可以根据输入框输入完成后要执行的业务逻辑指定软键盘右下角Action按钮的样式和行为,如让右下角按钮显示为发送按钮,点击后执行发送消息的逻辑。值得注意的是EditText输入框默认是可以多行显示的,此时的右下角Action按钮只会作为换行按钮,无论你的imeOptions指定的是什么。
如果想监听并处理Action按钮的点击逻辑,可以为EditText设置TextView.OnEditorActionListener。
如果在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应请求,给EditText设置一个onEditorActionListener就好了,简单示例如下:
mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
//TODO 这里做"回车"响应处理
return true;
}
});
显示输入法
默认情况下,进入Activity时即使EditText获取到焦点也不会自动弹出输入法的软键盘,因为进入该Activity的第一件事可能并不是输入数据。如果你想在进入该Activity时就显示输入法,只需为元素指定android:windowSoftInputMode="stateVisible"属性即可(如果设备有物理键盘则不会显示输入法)。
如果要手动显示输入法,则只需先让View获取焦点(调用requestFocus()),然后使用InputMethodManager的showSoftInput()方法显示输入法:
public void showSoftKeyboard(View view) {
if (view.requestFocus()) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
如何在Activity当中判断输入法是否显示,如何隐藏显示
//whether the input is showing
if (getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE){
//hide input method
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}