我想在Android中处理"解散软键盘"事件,据我所知,这样做的唯一解决方案是子类EditText
,我根据这个答案做了
这是我的班级:
public class EditTextCustom extends EditText {
public EditTextCustom(Context context) {
super(context);
}
public EditTextCustom(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextCustom(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (listener != null)
listener.onStateChanged(this, true);
}
@Override
public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
Log.d("Info", "Soft keyboard was hidden");
if (listener != null) {
listener.onStateChanged(this, false);
}
}
return super.onKeyPreIme(keyCode, event);
}
KeyboardListener listener;
public void setOnKeyboardListener(KeyboardListener listener) {
this.listener = listener;
}
public interface KeyboardListener {
void onStateChanged(EditTextCustom keyboardEditText, boolean showing);
}
}
我需要这个事件(KeyEvent.KEYCODE_BACK
和KeyEvent.ACTION_UP
)作为EditorInfo.IME_ACTION_DONE
,即当用户解散软键盘时,如果它已按下"Done"
并且对EditText
进行了编辑,则Android将解释它。
实现这个的最佳实践?
mEtNumber.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// do something, e.g. set your TextView here via .setText()
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return true;
}
return false;
}
});
mEtNumber。setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// do something, e.g. set your TextView here via .setText()
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return true;
}
return false;
}
});
和xml中的
android: imeOptions = " actionDone "