Skip to content

Commit

Permalink
VIVO手机上del键无效OnKeyListener不响应问题
Browse files Browse the repository at this point in the history
  • Loading branch information
mosentest committed Mar 14, 2019
1 parent 4febf6f commit 17809cb
Show file tree
Hide file tree
Showing 5 changed files with 497 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

Expand Down Expand Up @@ -162,7 +161,7 @@ public VerificationCodeView(Context context, AttributeSet attrs) {
@SuppressLint("ResourceAsColor")
private void initView() {
for (int i = 0; i < mEtNumber; i++) {
EditText editText = new EditText(mContext);
ZanyEditText editText = new ZanyEditText(mContext);
initEditText(editText, i);
addView(editText);
if (i == 0) { //设置第一个editText获取焦点
Expand All @@ -171,7 +170,7 @@ private void initView() {
}
}

private void initEditText(EditText editText, int i) {
private void initEditText(ZanyEditText editText, int i) {
int childHPadding = 14;
int childVPadding = 14;

Expand Down Expand Up @@ -281,7 +280,8 @@ public void afterTextChanged(Editable s) {

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
if (keyCode == KeyEvent.KEYCODE_DEL
&& event.getAction() == KeyEvent.ACTION_DOWN) {
backFocus();
}
return false;
Expand All @@ -301,10 +301,10 @@ public void setEnabled(boolean enabled) {
*/
private void focus() {
int count = getChildCount();
EditText editText;
ZanyEditText editText;
//利用for循环找出还最前面那个还没被输入字符的EditText,并把焦点移交给它。
for (int i = 0; i < count; i++) {
editText = (EditText) getChildAt(i);
editText = (ZanyEditText) getChildAt(i);
if (editText.getText().length() < 1) {
editText.setCursorVisible(true);
editText.requestFocus();
Expand All @@ -314,34 +314,34 @@ private void focus() {
}
}
//强行最后一个一直拿焦点,不然删除时候出问题
EditText lastEditText = (EditText) getChildAt(mEtNumber - 1);
ZanyEditText lastEditText = (ZanyEditText) getChildAt(mEtNumber - 1);
if (!TextUtils.isEmpty(lastEditText.getText().toString())) {
lastEditText.requestFocus();
}
}

private void backFocus() {
//博主手机不好,经常点一次却触发两次`onKey`事件,就设置了一个防止多点击,间隔100毫秒。
long startTime = System.currentTimeMillis();
EditText editText;
//long startTime = System.currentTimeMillis();
ZanyEditText editText;
//循环检测有字符的`editText`,把其置空,并获取焦点。
for (int i = mEtNumber - 1; i >= 0; i--) {
editText = (EditText) getChildAt(i);
if (editText.getText().length() >= 1 && startTime - endTime > 100) {
editText = (ZanyEditText) getChildAt(i);
if (editText.getText().length() >= 1) {// && startTime - endTime > 100
editText.setText("");
editText.setCursorVisible(true);
editText.requestFocus();
endTime = startTime;
//endTime = startTime;
return;
}
}
}

private void getResult() {
StringBuffer stringBuffer = new StringBuffer();
EditText editText;
ZanyEditText editText;
for (int i = 0; i < mEtNumber; i++) {
editText = (EditText) getChildAt(i);
editText = (ZanyEditText) getChildAt(i);
stringBuffer.append(editText.getText());
}
if (onCodeFinishListener != null) {
Expand All @@ -350,9 +350,9 @@ private void getResult() {
}

public void clearText() {
EditText editText;
ZanyEditText editText;
for (int i = 0; i < mEtNumber; i++) {
editText = (EditText) getChildAt(i);
editText = (ZanyEditText) getChildAt(i);
editText.setText("");
}
focus();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.moziqi.pwd.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputConnectionWrapper;
import android.widget.EditText;

/**
* https://blog.csdn.net/yanghuiyu38/article/details/53638601
*/
public class ZanyEditText extends EditText {
private OnDelKeyEventListener delKeyEventListener;

public ZanyEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public ZanyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ZanyEditText(Context context) {
super(context);
}


@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
true);
}

private class ZanyInputConnection extends InputConnectionWrapper {

public ZanyInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}

@Override
public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
if (delKeyEventListener != null) {
delKeyEventListener.onDeleteClick();
return true;
}
}
return super.sendKeyEvent(event);
}


@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
if (beforeLength == 1 && afterLength == 0) {
return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_DEL))
&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
KeyEvent.KEYCODE_DEL));
}

return super.deleteSurroundingText(beforeLength, afterLength);
}

}

/**
* 功能描述: <br>
* 〈功能详细描述〉
*
* @param delKeyEventListener EditText删除回调
*/
public void setDelKeyEventListener(OnDelKeyEventListener delKeyEventListener) {
this.delKeyEventListener = delKeyEventListener;
}

public interface OnDelKeyEventListener {
void onDeleteClick();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.moziqi.pwd.widget.deledittext;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

/**
* https://blog.csdn.net/sollian/article/details/60959542
*/
public class DetectDelEventEditText extends EditText implements View.OnKeyListener,
EditableInputConnection.OnDelEventListener {
private DelEventListener delEventListener;

/**
* 防止delEvent触发两次。
* 0:未初始化;1:使用onKey方法触发;2:使用onDelEvdent方法触发
*/
private int flag;

public DetectDelEventEditText(Context context) {
super(context);
init();
}

public DetectDelEventEditText(Context context,
@Nullable AttributeSet attrs) {
super(context, attrs);
init();
}

public DetectDelEventEditText(Context context,
@Nullable
AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init() {
setOnKeyListener(this);
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
super.onCreateInputConnection(outAttrs);
EditableInputConnection editableInputConnection = new EditableInputConnection(this);
outAttrs.initialSelStart = getSelectionStart();
outAttrs.initialSelEnd = getSelectionEnd();
outAttrs.initialCapsMode = editableInputConnection.getCursorCapsMode(getInputType());

editableInputConnection.setDelEventListener(this);
flag = 0;

return editableInputConnection;
}

public void setDelListener(DelEventListener l) {
delEventListener = l;
}

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (flag == 2) {
return false;
}
flag = 1;
return delEventListener != null && keyCode == KeyEvent.KEYCODE_DEL && event
.getAction() == KeyEvent.ACTION_DOWN && delEventListener.delEvent();
}

@Override
public boolean onDelEvent() {
if (flag == 1) {
return false;
}
flag = 2;
return delEventListener != null && delEventListener.delEvent();
}

// @Override
// public boolean onKey(View v, int keyCode, KeyEvent event) {
// return false;
// }

public interface DelEventListener {
boolean delEvent();
}
}
Loading

0 comments on commit 17809cb

Please sign in to comment.