Android EditText डिलीट (बैकस्पेस) प्रमुख ईवेंट


122

मैं एक EditText के लिए डिलीट (बैकस्पेस) की महत्वपूर्ण घटना का पता कैसे लगा सकता हूँ? मैंने TextWatcher का उपयोग करने की कोशिश की है, लेकिन जब editText खाली होता है, जब मैं कुंजी हटाता हूं, तो कुछ भी नहीं होता है। मैं डिलीट की प्रेस फाइट को एडिट टेक्स्ट से डिटेक्ट करना चाहता हूं, भले ही उसमें कोई टेक्स्ट न हो।

जवाबों:


172

नोट: onKeyListenerसॉफ्ट कीबोर्ड के लिए काम नहीं करता है।

आप सेट कर सकते हैं OnKeyListenerआप के लिए editTextतो आप किसी भी कुंजी दबाएँ पता लगा सकते हैं
संपादित करें: एक आम गलती हम जाँच कर रहे हैं KeyEvent.KEYCODE_BACKके लिए backspace, लेकिन वास्तव में यह है KeyEvent.KEYCODE_DEL(वास्तव में उस नाम बहुत भ्रामक है!)

editText.setOnKeyListener(new 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) {  
            //this is for backspace
        }
        return false;       
    }
});

9
मैं सिर्फ यह कोशिश की, लेकिन onKeyListeners जाहिरा तौर पर backspaces रजिस्टर नहीं है।
13

3
यह सॉफ्ट कीबोर्ड के लिए काम नहीं करेगा। यह केवल हार्डवेयर इनपुट के लिए काम करेगा।
वरुणोदय

6
मेरे Nexus4 (स्टॉक किटकैट को चलाने पर) यह सॉफ्टवेयर कीबोर्ड के लिए काम करता है
मथायस

10
तो अगर यह नरम कुंजी के लिए काम नहीं करता है, तो इस उत्तर को एंड्रॉइड प्लेटफॉर्म के तहत / में क्यों स्वीकार किया जाता है
डीजेफनी

32
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DELयदि आप बैकस्पेस के प्रेस प्रति दो बार फायर करने की घटना नहीं करना चाहते हैं, तो उपयोग करें
Fonix

83

आपके पूछे जाने में कुछ समय हो गया है लेकिन मेरे पास बस यही मुद्दा था। जैसा कि पहले ही एस्टेल द्वारा मुख्य श्रोताओं के साथ समस्या का उल्लेख है कि वे केवल हार्डवेयर कीबोर्ड के साथ काम करते हैं। IME (सॉफ्ट कीबोर्ड) के साथ ऐसा करने के लिए , समाधान थोड़ा अधिक विस्तृत है।

एकल पद्धति हम वास्तव में ओवरराइड करना चाहते हैं sendKeyEventमें EditTextके InputConnectionवर्ग। IME में मुख्य ईवेंट होने पर इस विधि को कहा जाता है। लेकिन इसे ओवरराइड करने के लिए, हमें एक कस्टम को लागू करने की आवश्यकता है EditTextजो एक प्रॉक्सी क्लास में onCreateInputConnectionडिफ़ॉल्ट InputConnectionऑब्जेक्ट को लपेटते हुए विधि को ओवरराइड करता है ! : |

जटिल लगता है, लेकिन यहां मैं सबसे सरल उदाहरण दे सकता हूं:

public class ZanyEditText extends EditText {

    private Random r = new Random();

    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);
    }

    public void setRandomBackgroundColor() {
        setBackgroundColor(Color.rgb(r.nextInt(256), r.nextInt(256), r
                .nextInt(256)));
    }

    @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) {
                ZanyEditText.this.setRandomBackgroundColor();
                // Un-comment if you wish to cancel the backspace:
                // return false;
            }
            return super.sendKeyEvent(event);
        }

    }

}

कॉल के साथ लाइन setRandomBackgroundColorवह जगह है जहां मेरा विशेष बैकस्पेस एक्शन होता है। इस मामले में, EditTextपृष्ठभूमि का रंग बदलना ।

यदि आप इसे XML से फुला रहे हैं तो टैग के रूप में पूर्ण पैकेज नाम का उपयोग करना याद रखें:

<cc.buttfu.test.ZanyEditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/somefield"
></cc.buttfu.test.ZanyEditText>

27
मैं हाल ही में जेली बीन पर एक ही मुद्दे में भाग गया। मैंने पाया कि यह समाधान ज्यादातर काम करता है, सिवाय इसके कि मुझे sendKeyEvent (...) (जिसे बिल्कुल भी नहीं बुलाया जा रहा था) के बजाय deleteSurroundingText (...) को ओवरराइड करना पड़ा। मनाइए कि यह किसी और के लिए सहायक हो!
ब्रैंडन

यह उत्तर, ऊपर दिए गए @Brandon टिप्पणी के साथ संयुक्त रूप से मेरे लिए काम कर रहा है। अब मैं सोच रहा हूं कि यह प्री-जेलीबीन उपकरणों पर कैसे काम करेगा।
क्रिस्टोफर पेरी

यह मेरे लिए 2.2 और 2.3 उपकरणों पर स्वीकृत उत्तर के साथ काम करता है।
क्रिस्टोफ़

ऐसा लगता है कि यह 2.3 पर दो बार बैकस्पेस के लिए महत्वपूर्ण घटना को फायर कर रहा है ... /
जेफ

25
यह तब काम नहीं करता है जब एडिटेक्स खाली हो, एडिटेक्स खाली होने पर डिलीट की के लिए कोई ईवेंट कैसे प्राप्त करें और कोई टेक्स्ट नहीं है, इस पर कोई विचार? ४.२
रिकस्टर

69

यह केवल इदरिस के जवाब के लिए एक अतिरिक्त है, जो ओवरराइड को डिलीट करने के लिए AddSurroundingText में भी जोड़ देता है। मुझे उस पर अधिक जानकारी मिली: Android: WebView / BaseInputConnection में बैकस्पेस

package com.elavon.virtualmerchantmobile.utils;

import java.util.Random;

import android.content.Context;
import android.graphics.Color;
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;

public class ZanyEditText extends EditText {

    private Random r = new Random();

    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);
    }

    public void setRandomBackgroundColor() {
        setBackgroundColor(Color.rgb(r.nextInt(256), r.nextInt(256), r
                .nextInt(256)));
    }

    @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) {
                ZanyEditText.this.setRandomBackgroundColor();
                // Un-comment if you wish to cancel the backspace:
                // return false;
            }
            return super.sendKeyEvent(event);
        }


        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {       
            // magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
            if (beforeLength == 1 && afterLength == 0) {
                // backspace
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                    && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
            }

            return super.deleteSurroundingText(beforeLength, afterLength);
        }

    }

}

3
धन्यवाद! deleteSurroundingTextबिट वास्तव में क्या मैं अनगिनत अन्य समाधान की कोशिश कर के बाद की जरूरत थी।
एडम रोसेनफील्ड

5
इस समाधान ने पिछले एंड्रॉइड संस्करणों पर मेरे लिए वास्तव में अच्छी तरह से काम किया है, लेकिन दुर्भाग्य से डिलीटसुरंगिंगटेक्स्ट को केवल 4.4 (किटकैट) पर व्हाट्सएप को हटाते समय कहा जाता है। मैंने Nexus4 और 7.
Dean

1
ऐसा लगता है कि जब EditText मल्टीलाइन है, तो deleteSurroundingText आवश्यक है। अजीब
एलेक्स सोरोकोलेटोव

7
धन्यवाद एक टन आदमी, बाहर के साथ काम नहीं किया। एंड्रॉइड इतना यादृच्छिक है कि उन्हें इसका नाम बदलकर androm करना चाहिए।
टॉरस्टेन ओजापर्व

2
यह मेरे लिए काम करता है, लेकिन मैं अब विराम चिह्न या रिक्त स्थान नहीं हटा सकता!
jaytj95

29

यहाँ मेरा आसान समाधान है, जो सभी एपीआई के लिए काम करता है:

private int previousLength;
private boolean backSpace;

// ...

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    previousLength = s.length();
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
    backSpace = previousLength > s.length();

    if (backSpace) {

        // do your stuff ...

    } 
}

अद्यतन दिनांक 17.04.18
जैसा कि टिप्पणियों में बताया गया है, यह समाधान बैकस्पेस प्रेस को ट्रैक नहीं करता है यदि EditText खाली है (अधिकांश अन्य समाधानों के समान)।
हालाँकि, यह अधिकांश उपयोग के मामलों के लिए पर्याप्त है।
PS अगर मुझे आज कुछ ऐसा ही बनाना होता, तो मैं करता:

public abstract class TextWatcherExtended implements TextWatcher {

    private int lastLength;

    public abstract void afterTextChanged(Editable s, boolean backSpace);

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        lastLength = s.length();
    }

    @Override
    public void afterTextChanged(Editable s) {
        afterTextChanged(s, lastLength > s.length());
    }  
}

तो बस इसे एक नियमित TextWatcher के रूप में उपयोग करें:

 editText.addTextChangedListener(new TextWatcherExtended() {
        @Override
        public void afterTextChanged(Editable s, boolean backSpace) {
           // Here you are! You got missing "backSpace" flag
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // Do something useful if you wish.
            // Or override it in TextWatcherExtended class if want to avoid it here 
        }
    });

बस मैं यह चाहता हूं! धन्यवाद!
डीएच 28


@Leo Droidcoder मैं एक समान समाधान में इस्तेमाल किया। स्पष्ट, संक्षिप्त और पूरी तरह से काम करता है ... चीयर्स।
AJW

इस एल्गोरिथ्म में एक दोष है जैसे कि यदि आप टाइप करने के बाद स्थान पर क्लिक करते हैं तो पिछली लंबाई s.length से अधिक है
Marcin S.

2
जब तक आप चयन (स्वत: पूर्णता) का उपयोग नहीं करते हैं
जावरा

13

मैंने एक समाधान खोजने के लिए 2 दिन भेजे और मैंने एक काम कर लिया :) (नरम कुंजी पर)

public TextWatcher textWatcher = new TextWatcher() {
@Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {   } 

@Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (count == 0) {
        //Put your code here.
        //Runs when delete/backspace pressed on soft key (tested on htc m8)
        //You can use EditText.getText().length() to make if statements here
        }
    }

@Override
    public void afterTextChanged(Editable s) {
    }
}

अपने एडिट टेक्स्ट से टेक्स्टवॉचर जोड़ने के बाद:

yourEditText.addTextChangedListener(textWatcher);

मुझे आशा है कि यह एक और एंड्रॉइड डिवाइस पर भी काम करता है (सैमसंग, एलजी, आदि)।


डिवाइस एचटीसी की इच्छा (एचटीसी आम है :-P)
जुनैद

यदि टाइप किया गया श्वेत स्थान है, तो भी गिनती == 0
बिन्सी बेबी

शानदार नं 1 उत्तर भाई :)
गुंडू बंडगर

6
यह पूरी तरह से काम नहीं करता है। count == 0 केवल तभी होगा जब edittext खाली हो!
सिंह Droidcoder

@ मैकार्लेक्सैंडर मैं इस उत्तर के बारे में निश्चित नहीं हूं, हालांकि आप ऊपर दिए गए उत्तर में मेरे समाधान की जांच कर सकते हैं
लियो डायरोडोडर

5

मेरा सरल समाधान जो पूरी तरह से काम करता है। आपको एक ध्वज जोड़ना चाहिए। मेरा कोड स्निपेट:

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (after < count) {
                isBackspaceClicked = true;
            } else {
                isBackspaceClicked = false;
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }

        @Override
        public void afterTextChanged(Editable s) {
            if (!isBackspaceClicked) {
                // Your current code
            } else {
                // Your "backspace" handling
            }
        }

textChangeListner ने कभी भी emptTextview पर कॉल नहीं किया।
जनार्दन आर

3

TextWatcher के साथ EditText बनाने का उदाहरण

EditText someEdit=new EditText(this);
//create TextWatcher for our EditText
TextWatcher1 TW1 = new TextWatcher1(someEdit);
//apply our TextWatcher to EditText
        someEdit.addTextChangedListener(TW1);

कस्टम TextWatcher

public class TextWatcher1 implements TextWatcher {
        public EditText editText;
//constructor
        public TextWatcher1(EditText et){
            super();
            editText = et;
//Code for monitoring keystrokes
            editText.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if(keyCode == KeyEvent.KEYCODE_DEL){
                        editText.setText("");
                    }
                        return false;
                }
            });
        }
//Some manipulation with text
        public void afterTextChanged(Editable s) {
            if(editText.getText().length() == 12){
                editText.setText(editText.getText().delete(editText.getText().length() - 1, editText.getText().length()));
                editText.setSelection(editText.getText().toString().length());
            }
            if (editText.getText().length()==2||editText.getText().length()==5||editText.getText().length()==8){
                editText.setText(editText.getText()+"/");
                editText.setSelection(editText.getText().toString().length());
            }
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {



        }
    }

1

कोटलिन का उपयोग करने वाले कुछ लोगों के लिए

addOnTextChanged कुछ मामलों को संभालने के लिए पर्याप्त लचीला नहीं है (उदाहरण: पता लगाएँ कि क्या उपयोगकर्ता प्रेस पाठ को खाली करते समय हटाता है)

setOnkeyListenerसॉफ्ट कीबोर्ड या हार्डकीबोर्ड पर भी काम किया! लेकिन सिर्फ कुछ उपकरणों पर । मेरे मामले में, यह सैमसंग s8 पर काम करता है लेकिन Xiaomi mi8 se पर काम नहीं करता है।

यदि आप कोटलिन का उपयोग कर रहे हैं, तो आप क्रॉसलाइन फ़ंक्शन का उपयोग कर सकते हैं doOnTextChanged, यह उसी तरह का है addOnTextChangedलेकिन कॉलबैक को ट्रिगर किया गया है यहां तक ​​कि संपादित पाठ खाली था।

नोट: doOnTextChanged Android KTX लाइब्रेरी का एक हिस्सा है


2
आप शायद निर्दिष्ट कर सकते हैं कि doOnTextChanged विस्तार कार्य एंड्रॉइड केटीएक्स लाइब्रेरी में उपलब्ध है
पत्थर

2
लेकिन ऐसा लगता है कि कॉलबैक "ट्रिगर नहीं है यहां तक ​​कि संपादित पाठ खाली था"। क्या आप खाली के लिए डिलीट (बैकस्पेस) अवरोधन के साथ कुछ स्निपेट प्रदान कर सकते हैं EditText? अग्रिम धन्यवाद
पत्थर

1
आह, मैं एक परियोजना विकसित जब मैं यह परीक्षण किया है मेरे मामले में जियाओमी mi8se पर है, जब एडिटेक्स खाली है और आप डिलीट दबाते हैं, तो कोई कॉलबैक निकाल नहीं सकता है। मैं इस वाक्य के लिए स्निपेट खोजूंगा।
Mạnh Hoàng Huynh

0

Stackoverflow में एक समान प्रश्न है। आपको उस ऑब्जेक्ट EditTextतक पहुंच प्राप्त करने के लिए ओवरराइड करने की आवश्यकता है InputConnectionजिसमें deleteSurroundingTextविधि शामिल है। यह विलोपन (बैकस्पेस) ईवेंट का पता लगाने में आपकी मदद करेगा। कृपया, मेरे द्वारा दिए गए समाधान पर एक नज़र डालें जो एंड्रॉइड - बैकस्पेस पर कब्जा नहीं कर सकता / नरम में प्रेस को हटा सकता है। कीबोर्ड


0

यह मेरे लिए काम कर रहा है:

public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (before - count == 1) {
        onBackSpace();
    } else if (s.subSequence(start, start + count).toString().equals("\n")) {
        onNewLine();
    }
}

0

मुझे संवाद में भी इसी मुद्दे का सामना करना पड़ रहा है .. क्योंकि मैं setOnKeyListener का उपयोग कर रहा हूं .. लेकिन मैं डिफ़ॉल्ट रूप से सही सेट करता हूं। नीचे कोड की तरह परिवर्तन के बाद यह मेरे लिए ठीक काम कर रहा है ..

    mDialog.setOnKeyListener(new Dialog.OnKeyListener() {

        @Override
        public boolean onKey(DialogInterface arg0, int keyCode,
                             KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                mDialog.dismiss();
                return true;
            }
            return false;//this line is important 

        }
    });

0

@Jiff के आधार पर ZanyEditTextयहाँ WiseEditTextसाथ हैsetSoftKeyListener(OnKeyListener)

package com.locopixel.seagame.ui.custom;

import java.util.Random;

import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputConnectionWrapper;

public class WiseEditText extends AppCompatEditText {

    private Random r = new Random();
    private OnKeyListener keyListener;

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

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

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

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new MyInputConnection(super.onCreateInputConnection(outAttrs),
                true);
    }

    private class MyInputConnection extends InputConnectionWrapper {

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

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            if (keyListener != null) {
                keyListener.onKey(WiseEditText.this,event.getKeyCode(),event);
            }
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {       
            // magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
            if (beforeLength == 1 && afterLength == 0) {
                // backspace
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                    && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
            }

            return super.deleteSurroundingText(beforeLength, afterLength);
        }

    }

    public void setSoftKeyListener(OnKeyListener listener){
        keyListener = listener;
    }

}

इसे प्रत्येक डिलीट की इवेंट के लिए दो बार कॉल किया जा रहा है।
पंकज कुमार

0

मेरी समस्या यह थी, कि मेरे पास रिवाज़ था Textwatcher, इसलिए मैं OnKeyListenerएक ऐसी चीज़ को जोड़ना नहीं चाहता था EditTextऔर साथ ही मैं रिवाज़ नहीं बनाना चाहता था EditText। मैं यह पता लगाना चाहता था कि क्या बैकस्पेस को मेरे अंदर दबाया गया थाafterTextChanged तरीके से , इसलिए मुझे अपना इवेंट ट्रिगर नहीं करना चाहिए।

इसी से मैंने इसका हल निकाला। आशा है कि यह किसी के लिए उपयोगी होगा।

public class CustomTextWatcher extends AfterTextChangedTextWatcher {

private boolean backspacePressed;

@Override
public void afterTextChanged(Editable s) {
    if (!backspacePressed) {
        triggerYourEvent();
    }
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    super.onTextChanged(s, start, before, count);
    backspacePressed = count == 0; //if count == 0, backspace is pressed
}
}

0

मैंने संस्करण 4.2, 4.4, 6.0 पर @ जेफ के समाधान का परीक्षण किया है। 4.2 और 6.0 पर, यह अच्छी तरह से काम करता है। लेकिन 4.4 पर, यह काम नहीं करता है।

मुझे इस समस्या के आसपास काम करने का एक आसान तरीका मिला। मुख्य बिंदु यह है कि एडिटिंग कैरेक्टर में एक अदृश्य कैरेक्टर को भीख मांगने के लिए एडिटटेक्स्ट में डाला जाए और इस कैरेक्टर से पहले यूजर को कर्सर न हिलाने दें। मेरा तरीका यह है कि उस पर शून्य चौड़ाई के एक ImageSpan के साथ एक सफेद-अंतरिक्ष चरित्र डालें। यहाँ मेरा कोड है।

                @Override
                public void afterTextChanged(Editable s) {
                    String ss = s.toString();
                    if (!ss.startsWith(" ")) {
                        int selection = holder.editText.getSelectionEnd();
                        s.insert(0, " ");
                        ss = s.toString();
                        holder.editText.setSelection(selection + 1);
                    }
                    if (ss.startsWith(" ")) {
                        ImageSpan[] spans = s.getSpans(0, 1, ImageSpan.class);
                        if (spans == null || spans.length == 0) {
                            s.setSpan(new ImageSpan(getResources().getDrawable(R.drawable.zero_wdith_drawable)), 0 , 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }
                    }
                }

और हमें कस्टम की जरूरत है एक EditText जिसमें एक SelectionChangeListener है

public class EditTextSelectable extends android.support.v7.widget.AppCompatEditText {
public interface OnSelectChangeListener {
    void onSelectChange(int start, int end);
}

private OnSelectChangeListener mListener;

public void setListener(OnSelectChangeListener listener) {
    mListener = listener;
}

...constructors...

@Override
protected void onSelectionChanged(int selStart, int selEnd) {
    if (mListener != null) {
        mListener.onSelectChange(selStart, selEnd);
    }
    super.onSelectionChanged(selStart, selEnd);
}

}

और आखिरी कदम

holder.editText.setListener(new EditTextSelectable.OnSelectChangeListener() {
                @Override
                public void onSelectChange(int start, int end) {
                    if (start == 0 && holder.editText.getText().length() != 0) {
                        holder.editText.setSelection(1, Math.max(1, end));
                    }
                }
            });

और अब, हम कर रहे हैं ~ हम बैकस्पेस कुंजी ईवेंट का पता लगा सकते हैं जब EditText में कोई वास्तविक सामग्री नहीं है, और उपयोगकर्ता को हमारी चाल के बारे में कुछ नहीं पता होगा।


0

यह प्रश्न पुराना हो सकता है लेकिन TextWatcher का उपयोग करके उत्तर वास्तव में सरल है।

int lastSize=0;
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    //2. compare the old length of the text with the new one
    //3. if the length is shorter, then backspace was clicked
    if (lastSize > charSequence.length()) {
        //4. Backspace was clicked
        //5. perform action
    }
    //1. get the current length of of the text
    lastSize = charSequence.length();
}

पिछले समाधानों की तरह, यह स्वत: पूर्ण / सुझावों द्वारा ट्रिगर किया जा सकता है।
Stonz2

0

मुझे एक बहुत सरल समाधान मिला है जो एक नरम कीबोर्ड के साथ काम करता है।

override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {
    text?.let { 
        if(count < before) {
            Toast.makeText(context, "backspace pressed", Toast.LENGTH_SHORT).show()
            // implement your own code
        }
    }
}

-3

आप गतिविधि पर एक प्रमुख श्रोता सेट कर सकते हैं, और कॉलबैक विधि में, आप यह पता लगा सकते हैं कि उपयोगकर्ता ने किस कुंजी को मारा। नीचे दिया गया कोड आपके संदर्भ के लिए है। आशा करता हूँ की ये काम करेगा।

//after user hits keys, this method would be called.
public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (editText.isFocused()) {
            switch (keyCode) {
            case KeyEvent.KEYCODE_DEL:  //delete key
                Log.i("INFO", "delete key hit"); //you should see this log in ddms after you hit delete key
                break;
            }
        }
        return super.onKeyUp(keyCode, event);
    }

इस समाधान की जाँच की गई - KEYCODE_DEL को केवल तभी गतिविधि में फेंक दिया जाएगा जब संपादित पाठ स्वयं इसे संभाल नहीं लेगा। उदाहरण के लिए, जब editText में कोई पाठ नहीं है, या कुछ पाठ है, लेकिन कर्सर बहुत शुरुआत में है। अजीब बात है कि मेरे मामले में मुझे बिल्कुल उस व्यवहार की आवश्यकता है
एंटोन किजिमा

मेरी गतिविधि में कोई EditText नहीं है और मैं सिर्फ कीबोर्ड को प्रोग्रामेटिक रूप से प्रदर्शित करता हूं। मुझे प्रत्येक सॉफ्ट कीबोर्ड कुंजी को पकड़ने की आवश्यकता है और यह एकमात्र काम करने वाला समाधान लगता है। अन्य एक डिस्पैकेइवेंट विधि को ओवरराइड कर रहा है। दुर्भाग्य से JellyBean से शुरू IME DELETE कुंजी के लिए KeyEvent नहीं भेजता है। developer.android.com/reference/android/view/KeyEvent.html
बेमेइफ़े
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.