[Custom control] EditText realizes automatic focus (automatic display and hiding of input method)

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);
    }
}

Guess you like

Origin blog.csdn.net/qq_36881363/article/details/106661094