import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import java.lang.reflect.Method;
public class PasswordEdit extends EditText {
// 主线程通知调用结果
private final static Handler handler = new Handler(Looper.getMainLooper());
public PasswordEdit(@NonNull final Context context) {
super(context);
initPasswordEdit(context);
}
public PasswordEdit(@NonNull final Context context, @Nullable final AttributeSet attr) {
super(context, attr);
initPasswordEdit(context);
}
public PasswordEdit(@NonNull final Context context, @Nullable final AttributeSet attr, int defStyleAttr) {
super(context, attr, defStyleAttr);
initPasswordEdit(context);
}
public PasswordEdit(@NonNull final Context context, @Nullable final AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initPasswordEdit(context);
}
private void doStartPasswordEditKeyBoard(@NonNull final Context context) {
final InputMethodManager imm = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE));
//关闭键盘,如果键盘正在显示,或者正在关闭,等待键盘关闭完成的通知
final boolean wait = imm.hideSoftInputFromWindow(this.getWindowToken(), 0, new ResultReceiver(handler) {
@Override
protected void onReceiveResult(final int resultCode, @Nullable final Bundle resultData) {
// 收到通知时,需要检查一下焦点是否已经移走,如果已经不在了,就不需要弹出键盘了
if (PasswordEdit.this.hasFocus()) {
// 此处需要递归处理,原因为异步状态下,收到通知的时候,键盘可能已经处于弹出状态了
doStartPasswordEditKeyBoard(context);
}
}
});
// 键盘已经处于隐藏状态
if (!wait) {
StartPasswordKeyBoard();
}
}
// 阻止系统键盘在输入框获得焦点的时候自动弹出
private void disableShowSoftInputOnFocus() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
this.setShowSoftInputOnFocus(false);
} else {
try {
Method method = EditText.class.getMethod("setShowSoftInputOnFocus", Boolean.TYPE);
method.setAccessible(true);
method.invoke(this, false);
} catch (Exception e) {
//e.printStackTrace();
}
}
}
@SuppressLint("ClickableViewAccessibility")
private void initPasswordEdit(@NonNull final Context context) {
this.setLongClickable(false);
this.disableShowSoftInputOnFocus();
this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(@NonNull final View view, @NonNull final MotionEvent motionEvent) {
doStartPasswordEditKeyBoard(context);
return true;
}
});
}
public void StartPasswordKeyBoard() {
//显示自定义的密码键盘的代码
}
}