安卓EditText焦点获取与释放、弹出和隐藏软键盘以及EditText内容更改、软键盘回车键的事件监听

xml文件布局

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:orientation="vertical">
            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <EditText
                    android:id="@+id/username"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="40dp"
                    android:hint="请输入登录账号"
                    android:imeActionLabel="name"
                    android:imeOptions="actionDone"
                    android:inputType="textEmailAddress"
                    android:selectAllOnFocus="true"
                    android:textColor="@color/black"
                    android:textSize="14sp" />
           </com.google.android.material.textfield.TextInputLayout>
            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:passwordToggleDrawable="@drawable/ic_select_show_hide_password"
                app:passwordToggleEnabled="true">
                <EditText
                    android:id="@+id/password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="40dp"
                    android:hint="请输入密码"
                    android:imeActionLabel="pwd"
                    android:imeOptions="actionDone"
                    android:inputType="textPassword"
                    android:selectAllOnFocus="true"
                    android:textColor="@color/black"
                    android:textSize="14sp" />
           </com.google.android.material.textfield.TextInputLayout>
       </LinearLayout>

不让EditText自动获取焦点

在EditText父布局中添加:
android:focusable="true"
android:focusableInTouchMode="true"

1. 获取焦点

当点击EditText时可自动获取焦点,也可以调用EditText.requestFocus()获取焦点。

2. 释放焦点

调用EditText.clearFocus()释放焦点。


设置软键盘回车的动作和动作监听,以及EditText内容改变的监听

1. 设置动作

xml中设置
android:imeOptions="actionDone" //回车键将会显示“完成”
常用有:actionNone(无操作)、actionGo(进入)、actionSearch(搜索)、actionSend(发送)、actionNext(下一步)、actionPrevious(上一步)、actionDone(完成)等动作。
Java中设置
EditText.setImeOptions(EditorInfo. IME_ACTION_DONE );//与xml中对应

2. 动作监听

EditText mUserName = (EditText) findViewById(R.id.username);
//软键盘回车键动作监听
mUserName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) {
        //没有设置imeOptions, 默认actionId == KeyEvent.KEYCODE_ENTER
        if (actionId == EditorInfo.IME_ACTION_DONE) {//imeOptions设置的动作
            //释放焦点并隐藏软键盘
            SoftKeyboardUtil.hideSoftKeyboard(v, true);
             * 在Activity中可以通过getCurrentFocus()方法得到当前获取焦点的view
             * 释放焦点并隐藏软键盘 SoftKeyboardUtil.hideSoftKeyboard(getCurrentFocus(), true);
            //去自定义下一步逻辑...
            return true;
        return false;
//EditText内容改变监听
mUserName.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        //EditText内容改变前
    @Override
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
        //EditText内容改变中
    @Override
    public void afterTextChanged(final Editable s) {
        //EditText内容改变后
});


SoftKeyboardUtil.java

package com.test.demo.util;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import java.util.Timer;
import java.util.TimerTask;
public class SoftKeyboardUtil {
     * 延时弹出软键盘
     * @param activity 当前activity
     * @param view     当前获取焦点的view
     * @param delay    延时弹出的时间
    public static void delayShowSoftInput(final Activity activity, final View view, final long delay) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            showSoftInput(view);
            }, delay);
     * 弹出软键盘
     * @param view 当前获取焦点的view
    public static void showSoftInput(final View view) {
        if (view != null) {
            view.setFocusable(true);
            view.setFocusableInTouchMode(true);
            view.requestFocus();//获取焦点
            InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            //if (!imm.isActive()) //没有显示键盘,弹出
                imm.showSoftInput(view, 0);
     * 隐藏软键盘
     * @param view         当前获取焦点的view
     * @param isClearFocus true释放焦点, false保留焦点
    public static void hideSoftKeyboard(final View view, final boolean isClearFocus) {
        if (view != null) {
            if (isClearFocus) view.clearFocus();
            InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);