简体   繁体   中英

how do i override the softkeypad backspace longpress functionality in android

I want to implement my own method when the user longpresses the backspace key ( KEYCODE_DEL ) in softkeypad in android.

So far I have done the following, But it's not working.

public class CustomEditText extends EditText{

private Random r = new Random();
private CustomEditText e = null;

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

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

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

    public void setEditText()
    {
        e = (CustomEditText)findViewById(R.id.edit_phone_number);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return (InputConnection) 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) {
                // This is never called . So i do not know when the user pressed 
                // and unpressed the backspace key.
                // return false;
            }
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength)
        {
            //This is getting called when user press and unpress the backspace 
            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);
        }
    }
}

Here when I press the backspace on softKeypad sendKeyEvent is not called but deleteSurroundingText gets called.

For longpress detection I wanted to get the KeyEvent.ACTION_DOWN event on backspace and KeyEvent.ACTION_UP event on backspace and if the time difference between these two events is more than 1/2 seconds I will assume it's a longpress. Since both KeyEvent.ACTION_DOWN and KeyEvent.ACTION_UP are coming in sendKeyEvent method . But sendKeyEvent is never called. So I do not know how do I do it.

Please help if you have any other approach to do it.

editPhoneNumberText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // You can identify which key pressed buy checking keyCode value
                // with KeyEvent.KEYCODE_
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
                    // this is for backspace
                    Logger.log("Thhis is what i need");
                }
                return false;
            }
        });

I faced the similar issue. Just change the following function and the rest is fine :-

@Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {
            if(android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
                if (beforeLength >= 1 && afterLength == 0) {
                    return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                            && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
                }
            }
            else if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
                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);
        }

Hope it helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM