安卓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);