effect
- EdiText does not get the focus by default. After clicking it, it enters the input mode, and the input method pops up to get the focus.
- When the input is completed, the input method is hidden, and EditText automatically clears the focus.
achieve
1. Solve the problem that EditText automatically obtains the focus first, and add it in the parent layout
android:focusable="true"
android:focusableInTouchMode="true"
2. Write a custom EditText
public class EditText_AutoFocus extends androidx.appcompat.widget.AppCompatEditText {
OnEditCompleteListener mOnEditCompleteListener = null;
EditText_AutoFocus editText = this;
public EditText_AutoFocus(Context context) {
super(context);
init();
}
public EditText_AutoFocus(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditText_AutoFocus(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
getWindowVisibleDisplayFrame(r);
if ((getRootView().getHeight() - (r.bottom)) < 20) {
//软键盘隐藏
if (isFocused()) {
if (mOnEditCompleteListener != null) {
mOnEditCompleteListener.onEditComplete(editText);
}
clearFocus();
}
}
}
});
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
//焦点发生变化
if (mOnEditCompleteListener != null) {
mOnEditCompleteListener.onEditComplete(editText);
}
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void clearFocus() {
if (mOnEditCompleteListener != null) {
mOnEditCompleteListener.onEditComplete(editText);
}
super.clearFocus();
}
void setOnEditCompleteListener(OnEditCompleteListener onEditCompleteListener) {
this.mOnEditCompleteListener = onEditCompleteListener;
}
interface OnEditCompleteListener {
void onEditComplete(EditText_AutoFocus editText);
}
}