दिलचस्प पोस्ट
वैश्विक स्तर पर 410 के कोण के साथ हैंडलिंग मान त्रुटि: एक से अधिक तत्व के साथ एक सरणी का सत्य मान अस्पष्ट है। A.any () या a.all () का उपयोग करें HttpWebRequest के साथ कुकीज़ का उपयोग कैसे करें मैं ऑब्जेक्ट के आकार को पायथन में कैसे निर्धारित करूं? प्रोग्राम बैकस्टैक्स में पिछले खंड पर वापस जाएं पायथन सुपर विधि और कॉलिंग विकल्प एचटीएमएल पृष्ठ में पाठ को jQuery के साथ बदलें सी ++ में सरणियों या std :: vectors का उपयोग करना, प्रदर्शन अंतर क्या है? फायरबसे से डेटा पूछताछ जावा में पूर्णांक में दोहरे कास्ट करें इनपुट प्रकार = "टेक्स्ट" में aschange के रूप में आप को ट्रैक करने का सबसे अच्छा तरीका? क्या node.js के लिए एक नौकरी अनुसूचक पुस्तकालय है? Servlet / JSP में लोड गुण फ़ाइल लोड करें जावास्क्रिप्ट: कोई फाइल अपलोड किए बिना … फ़ाइल के बिना अमान्य iPhone अनुप्रयोग बाइनरी

एंड्रॉइड – बैकस्पेस कैप्चर नहीं कर सकता / नरम में प्रेस हटाएं। कीबोर्ड

मैं सभी प्रमुख प्रेस को पकड़ने के लिए दृश्य (ओपन जीएल सतह दृश्य) की onDown विधि को ओवरराइड कर रहा हूं। समस्या यह है कि कई उपकरणों पर KEYCODE_DEL पर कब्जा नहीं किया गया है। मैंने एक दृश्य को जोड़ने के लिए कोशिश की है, और बैकस्पेस कुंजी को छोड़कर सब कुछ कब्जा कर लिया है।

इस कुंजी प्रेस कार्यक्रम को सुनने का एक तरीका होना चाहिए, लेकिन कैसे?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड – बैकस्पेस कैप्चर नहीं कर सकता / नरम में प्रेस हटाएं। कीबोर्ड"

Android के साथ एक बग की तरह दिखता है:

मुद्दा 42904 : कुंजीकोडीडीएलईएल घटना एसडीके 16 और इसके बाद के संस्करण में संपादन टेक्स्ट को वितरित नहीं किया गया है।

मुद्दा 42904 @ code.google.com

परिचय:

@ कार्ल और @ टरिक्स के समाधानों के परीक्षण के बाद मैंने देखा कि:

  1. कार्ल का समाधान यूनिकोड वर्णों या चरित्र अनुक्रमों में अच्छी तरह से काम नहीं करता है, क्योंकि ये ACTION_MULTIPLE ईवेंट के साथ वितरित होने लगते हैं, जो "डमी" वर्णों और वास्तविक चरित्र के बीच अंतर करना कठिन बना देता है।

  2. मैं अपने गैलेक्सी 5 (4.4.2) पर एंड्रॉइड के नवीनतम संस्करण में काम कर रहा हूं। मैंने कई एसडीके संस्करणों को लक्षित करने का परीक्षण किया, लेकिन उनमें से कोई भी काम नहीं करता है। शायद Google ने फिर से DEL कुंजी के पीछे तर्क को बदलने का फैसला किया है …

इसलिए, मैं निम्नलिखित संयुक्त समाधान के साथ आया हूं, कार्ल और टरिक्स दोनों के उत्तरों का उपयोग करते हुए। मेरा समाधान काम करने के लिए लंबे डमी वर्ण उपसर्ग के कार्ल के विचार को जोड़कर काम करता है, लेकिन उचित कुंजी ईवेंट बनाने के लिए कस्टम Editable लिए टिरिक्स के समाधान का उपयोग कर रहा है।

परिणाम:

मैंने एंड्रॉइड के विभिन्न संस्करणों और विभिन्न कीबोर्ड के साथ कई उपकरणों पर इस समाधान का परीक्षण किया है। नीचे दिए गए सभी परीक्षण मामलों मेरे लिए काम करते हैं मुझे कोई ऐसा मामला नहीं मिला है जहां यह समाधान काम नहीं करता है।

  • मानक Google कीबोर्ड के साथ Nexus 5 (4.4.2)
  • स्विफ्टकी के साथ नेक्सस 5 (4.4.2)
  • एचटीसी वन (4.2.2) मानक एचटीसी कीबोर्ड के साथ
  • मानक Google कीबोर्ड के साथ नेक्सस वन (2.3.6)
  • स्टैंडर्ड सैमसंग कीबोर्ड के साथ सैमसंग गैलेक्सी एस 3 (4.1.2)

मैंने विभिन्न एसडीके संस्करणों को लक्षित करने का भी परीक्षण किया है:

  • लक्ष्य 16
  • लक्ष्य 1 9

यदि यह समाधान आपके लिए भी काम करता है, तो कृपया

देखें:

 public class MyInputView extends EditText implements View.OnKeyListener { private String DUMMY; ... public MyInputView(Context context) { super(context); init(context); } private void init(Context context) { this.context = context; this.setOnKeyListener(this); // Generate a dummy buffer string // Make longer or shorter as desired. DUMMY = ""; for (int i = 0; i < 1000; i++) DUMMY += "\0"; } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { MyInputConnection ic = new MyInputConnection(this, false); outAttrs.inputType = InputType.TYPE_NULL; return ic; } @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { int action = keyEvent.getAction(); // Catch unicode characters (even character sequeneces) // But make sure we aren't catching the dummy buffer. if (action == KeyEvent.ACTION_MULTIPLE) { String s = keyEvent.getCharacters(); if (!s.equals(DUMMY)) { listener.onSend(s); } } // Catch key presses... if (action == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_DEL: ... break; case KeyEvent.KEYCODE_ENTER: ... break; case KeyEvent.KEYCODE_TAB: ... break; default: char ch = (char)keyEvent.getUnicodeChar(); if (ch != '\0') { ... } break; } } return false; } } 

इनपुट कनेक्शन:

 public class MyInputConnection extends BaseInputConnection { private MyEditable mEditable; public MyInputConnection(View targetView, boolean fullEditor) { super(targetView, fullEditor); } private class MyEditable extends SpannableStringBuilder { MyEditable(CharSequence source) { super(source); } @Override public SpannableStringBuilder replace(final int start, final int end, CharSequence tb, int tbstart, int tbend) { if (tbend > tbstart) { super.replace(0, length(), "", 0, 0); return super.replace(0, 0, tb, tbstart, tbend); } else if (end > start) { super.replace(0, length(), "", 0, 0); return super.replace(0, 0, DUMMY, 0, DUMMY.length()); } return super.replace(start, end, tb, tbstart, tbend); } } @Override public Editable getEditable() { if (Build.VERSION.SDK_INT < 14) return super.getEditable(); if (mEditable == null) { mEditable = this.new MyEditable(DUMMY); Selection.setSelection(mEditable, DUMMY.length()); } else if (mEditable.length() == 0) { mEditable.append(DUMMY); Selection.setSelection(mEditable, DUMMY.length()); } return mEditable; } @Override public boolean deleteSurroundingText(int beforeLength, int afterLength) { // Not called in latest Android version... return super.deleteSurroundingText(beforeLength, afterLength); } } 

मुझे ऐसे मुद्दों का सामना करना पड़ा जहां बैकस्पेस कुंजी के स्पर्श पर कुंजीकोडी डीईएलएल प्राप्त नहीं हो रहा था। यह मुझे लगता है कि नरम इनपुट कीबोर्ड पर निर्भर करता है, क्योंकि मेरी समस्या केवल कुछ तीसरे पक्ष के कीबोर्ड (swype मुझे लगता है) के मामले में हो रही है और डिफ़ॉल्ट Google कीबोर्ड के साथ नहीं।

(यह उत्तर कार्ल द्वारा यहां पोस्ट किए गए स्वीकार्य उत्तर में एक परिशिष्ट के रूप में होता है।)

दो बगों के शोध और समझ की सराहना करते हुए, कार्ल द्वारा यहां पोस्ट किए गए समाधान के साथ मुझे कुछ समस्याएं थीं। मेरा मुख्य मुद्दा यह था कि, कार्ल का टिप्पणी ब्लॉक कहता है कि पर KeyEvent.ACTION_MULTIPLE पथ पर केवल "पत्र रैक को चुनने के बाद प्राप्त पहली घटना" पर ले जाया जाएगा, मेरे लिए, हर एक प्रमुख घटना ने उस पथ को ले लिया । (मुझे एपीआई-लेवल BaseInputConnection.java के लिए BaseInputConnection.java कोड को BaseInputConnection.java पता लगाया गया है क्योंकि यह हर बार sendCurrentText() में पूरे Editable टेक्स्ट का उपयोग किया जाता है। मुझे यकीन नहीं है कि यह कार्ल के लिए क्यों काम करता है, लेकिन मुझे नहीं।)

तो, कार्ल के समाधान से प्रेरित, मैंने इसे इस समस्या को न करने के लिए अनुकूलित किया। 62306 जारी करने का मेरा समाधान (कार्ल के जवाब में जुड़ा हुआ) आईएमई में "सोचने की कोशिश कर रहा है" का एक ही बुनियादी प्रभाव प्राप्त करने का प्रयास करता है कि हमेशा अधिक पाठ होता है जिसे बैकस्पेस पर वापस किया जा सकता है हालांकि, यह सुनिश्चित करता है कि इसमें संपादन योग्य का एक अक्षर है। ऐसा करने के लिए, आपको अंतर्निहित वर्ग का विस्तार करना होगा जो Editable इंटरफ़ेस, SpannedStringBuilder , को निम्न के जैसा एक तरीके से लागू करता है:

  private class MyEditable extends SpannableStringBuilder { MyEditable(CharSequence source) { super(source); } @Override public SpannableStringBuilder replace(final int start, final int end, CharSequence tb, int tbstart, int tbend) { if (tbend > tbstart) { super.replace(0, length(), "", 0, 0); return super.replace(0, 0, tb, tbstart, tbend); } else if (end > start) { super.replace(0, length(), "", 0, 0); return super.replace(0, 0, DUMMY_CHAR, 0, 1); } return super.replace(start, end, tb, tbstart, tbend); } } 

असल में, जब भी IME संपादन योग्य replace() को बदलकर एक चरित्र को जोड़ने का प्रयास करता है, तो उस वर्ण को जो भी सिंगलटन कैरेक्टर की जगह मिलती है इस बीच, अगर आईएमई वहां पहुंचने का प्रयास करता है, तो इसके बजाय replace() ओवरराइड की बजाय एक सिंगलटन "डमी" कैरेक्टर के साथ क्या होता है (जो आपके ऐप को अनदेखा कर देना चाहिए) 1 की लंबाई बनाए रखने के लिए।

इसका मतलब यह है कि getEditable() ने ऊपर पोस्ट की तुलना में getEditable() और onKey() के कार्यान्वयन को थोड़ा सरल किया है। उदाहरण के लिए, यह मानते हुए कि ऊपर स्थित MyEditable वर्ग को एक आंतरिक वर्ग के रूप में लागू किया जाता है, getEditable() कुछ ऐसा होता है:

  @Override public Editable getEditable() { if (Build.VERSION.SDK_INT < 14) return super.getEditable(); if (mEditable == null) { mEditable = this.new MyEditable(DUMMY_CHAR); Selection.setSelection(mEditable, 1); } else if (m_editable.length() == 0) { mEditable.append(DUMMY_CHAR); Selection.setSelection(mEditable, 1); } return mEditable; } 

ध्यान दें कि इस समाधान के साथ, 1024-वर्ण की लंबी स्ट्रिंग बनाए रखने की कोई आवश्यकता नहीं है। न ही, "बैकस्पेसिंग बहुत ज्यादा" का खतरा है (जैसा कि बैलेस्पेस कुंजी को दबाए रखने के बारे में कार्ल की टिप्पणियों में चर्चा के अनुसार)।

पूर्णता के लिए, पर onKey() कुछ ऐसा हो जाता है:

  @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() != KeyEvent.ACTION_DOWN) return false; if ((int)DUMMY_CHAR.charAt(0) == event.getUnicodeChar()) return true; // Handle event/keyCode here as normal... } 

अंत में, मुझे ध्यान देना चाहिए कि उपरोक्त सभी का मतलब केवल 62306 जारी करने के लिए एक वैकल्पिक हल के रूप में है। कार्ल (ओवरराइडिंग deleteSurroundingText() द्वारा पोस्ट किए गए दूसरे मुद्दे, 42 9 4 के समाधान के साथ मेरे पास कोई समस्या नहीं थी और इसे उपयोग करने की सलाह दी जाएगी जैसा उसने पोस्ट किया था।

@ कार्ल के विचारों के कारण, मैं किसी ऐसे समाधान पर आया जो किसी भी इनपुट प्रकार के लिए ठीक से काम कर रहा है। नीचे मैं एक पूर्ण कार्यशील नमूना एप्लिकेशन देता हूं जिसमें 2 कक्षाएं MainActivity : MainActivity और CustomEditText :

 package com.example.edittextbackspace; import android.app.Activity; import android.os.Bundle; import android.text.InputType; import android.view.ViewGroup.LayoutParams; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CustomEditText edittext = initEditText(); setContentView(edittext); } private CustomEditText initEditText() { CustomEditText editText = new CustomEditText(this) { @Override public void backSpaceProcessed() { super.backSpaceProcessed(); editTextBackSpaceProcessed(this); } }; editText.setInputType(InputType.TYPE_CLASS_NUMBER); editText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); editText.setText("1212"); return editText; } private void editTextBackSpaceProcessed(CustomEditText customEditText) { // Backspace event is called and properly processed } } 

 package com.example.edittextbackspace; import android.content.Context; import android.text.Editable; import android.text.Selection; import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.EditText; import java.util.ArrayList; import java.util.List; public class CustomEditText extends EditText implements View.OnFocusChangeListener, TextWatcher { private String LOG = this.getClass().getName(); private int _inputType = 0; private int _imeOptions = 5 | EditorInfo.IME_FLAG_NO_EXTRACT_UI; private List<String> _lastComposingTextsList = new ArrayList<String>(); private BaseInputConnection _inputConnection = null; private String _lastComposingText = ""; private boolean _commitText = true; private int _lastCursorPosition = 0; private boolean _isComposing = false; private boolean _characterRemoved = false; private boolean _isTextComposable = false; public CustomEditText(Context context) { super(context); setOnFocusChangeListener(this); addTextChangedListener(this); } @Override public InputConnection onCreateInputConnection(final EditorInfo outAttrs) { CustomEditText.this._inputConnection = new BaseInputConnection(this, false) { @Override public boolean deleteSurroundingText(int beforeLength, int afterLength) { handleEditTextDeleteEvent(); return super.deleteSurroundingText(beforeLength, afterLength); } @Override public boolean setComposingText(CharSequence text, int newCursorPosition) { CustomEditText.this._isTextComposable = true; CustomEditText.this._lastCursorPosition = getSelectionEnd(); CustomEditText.this._isComposing = true; if (text.toString().equals(CustomEditText.this._lastComposingText)) return true; else CustomEditText.this._commitText = true; if (text.length() < CustomEditText.this._lastComposingText.length()) { CustomEditText.this._lastComposingText = text.toString(); try { if (text.length() > 0) { if (CustomEditText.this._lastComposingTextsList.size() > 0) { if (CustomEditText.this._lastComposingTextsList.size() > 0) { CustomEditText.this._lastComposingTextsList.remove(CustomEditText.this._lastComposingTextsList.size() - 1); } } else { CustomEditText.this._lastComposingTextsList.add(text.toString().substring(0, text.length() - 1)); } } int start = Math.max(getSelectionStart(), 0) - 1; int end = Math.max(getSelectionEnd(), 0); CustomEditText.this._characterRemoved = true; getText().replace(Math.min(start, end), Math.max(start, end), ""); } catch (Exception e) { Log.e(LOG, "Exception in setComposingText: " + e.toString()); } return true; } else { CustomEditText.this._characterRemoved = false; } if (text.length() > 0) { CustomEditText.this._lastComposingText = text.toString(); String textToInsert = Character.toString(text.charAt(text.length() - 1)); int start = Math.max(getSelectionStart(), 0); int end = Math.max(getSelectionEnd(), 0); CustomEditText.this._lastCursorPosition++; getText().replace(Math.min(start, end), Math.max(start, end), textToInsert); CustomEditText.this._lastComposingTextsList.add(text.toString()); } return super.setComposingText("", newCursorPosition); } @Override public boolean commitText(CharSequence text, int newCursorPosition) { CustomEditText.this._isComposing = false; CustomEditText.this._lastComposingText = ""; if (!CustomEditText.this._commitText) { CustomEditText.this._lastComposingTextsList.clear(); return true; } if (text.toString().length() > 0) { try { String stringToReplace = ""; int cursorPosition = Math.max(getSelectionStart(), 0); if (CustomEditText.this._lastComposingTextsList.size() > 1) { if (text.toString().trim().isEmpty()) { getText().replace(cursorPosition, cursorPosition, " "); } else { stringToReplace = CustomEditText.this._lastComposingTextsList.get(CustomEditText.this._lastComposingTextsList.size() - 2) + text.charAt(text.length() - 1); getText().replace(cursorPosition - stringToReplace.length(), cursorPosition, text); } CustomEditText.this._lastComposingTextsList.clear(); return true; } else if (CustomEditText.this._lastComposingTextsList.size() == 1) { getText().replace(cursorPosition - 1, cursorPosition, text); CustomEditText.this._lastComposingTextsList.clear(); return true; } } catch (Exception e) { Log.e(LOG, "Exception in commitText: " + e.toString()); } } else { if (!getText().toString().isEmpty()) { int cursorPosition = Math.max(getSelectionStart(), 0); CustomEditText.this._lastCursorPosition = cursorPosition - 1; getText().replace(cursorPosition - 1, cursorPosition, text); if (CustomEditText.this._lastComposingTextsList.size() > 0) { CustomEditText.this._lastComposingTextsList.remove(CustomEditText.this._lastComposingTextsList.size() - 1); } return true; } } return super.commitText(text, newCursorPosition); } @Override public boolean sendKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); CustomEditText.this._lastComposingTextsList.clear(); if (keyCode > 60 && keyCode < 68 || !CustomEditText.this._isTextComposable || (CustomEditText.this._lastComposingTextsList != null && CustomEditText.this._lastComposingTextsList.size() == 0)) { return super.sendKeyEvent(event); } else return false; } @Override public boolean finishComposingText() { if (CustomEditText.this._lastComposingTextsList != null && CustomEditText.this._lastComposingTextsList.size() > 0) CustomEditText.this._lastComposingTextsList.clear(); CustomEditText.this._isComposing = true; CustomEditText.this._commitText = true; return super.finishComposingText(); } @Override public boolean commitCorrection(CorrectionInfo correctionInfo) { CustomEditText.this._commitText = false; return super.commitCorrection(correctionInfo); } }; outAttrs.actionLabel = null; outAttrs.inputType = this._inputType; outAttrs.imeOptions = this._imeOptions; return CustomEditText.this._inputConnection; } @Override public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { if (keyCode == KeyEvent.KEYCODE_DEL) { int cursorPosition = this.getSelectionEnd() - 1; if (cursorPosition < 0) { removeAll(); } } return super.onKeyDown(keyCode, keyEvent); } @Override public void setInputType(int type) { CustomEditText.this._isTextComposable = false; this._inputType = type; super.setInputType(type); } @Override public void setImeOptions(int imeOptions) { this._imeOptions = imeOptions | EditorInfo.IME_FLAG_NO_EXTRACT_UI; super.setImeOptions(this._imeOptions); } public void handleEditTextDeleteEvent() { int end = Math.max(getSelectionEnd(), 0); if (end - 1 >= 0) { removeChar(); backSpaceProcessed(); } else { removeAll(); } } private void removeAll() { int startSelection = this.getSelectionStart(); int endSelection = this.getSelectionEnd(); if (endSelection - startSelection > 0) this.setText(""); else nothingRemoved(); } private void removeChar() { KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL); super.onKeyDown(event.getKeyCode(), event); } public void nothingRemoved() { // Backspace didn't remove anything. It means, a cursor of the editText was in the first position. We can use this method, for example, to switch focus to a previous view } public void backSpaceProcessed() { // Backspace is properly processed } @Override protected void onSelectionChanged(int selStart, int selEnd) { if (CustomEditText.this._isComposing) { int startSelection = this.getSelectionStart(); int endSelection = this.getSelectionEnd(); if (((CustomEditText.this._lastCursorPosition != selEnd && !CustomEditText.this._characterRemoved) || (!CustomEditText.this._characterRemoved && CustomEditText.this._lastCursorPosition != selEnd)) || Math.abs(CustomEditText.this._lastCursorPosition - selEnd) > 1 || Math.abs(endSelection - startSelection) > 1) { // clean autoprediction words CustomEditText.this._lastComposingText = ""; CustomEditText.this._lastComposingTextsList.clear(); CustomEditText.super.setInputType(CustomEditText.this._inputType); } } } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { CustomEditText.this._lastComposingText = ""; CustomEditText.this._lastComposingTextsList.clear(); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { int startSelection = getSelectionStart(); int endSelection = getSelectionEnd(); if (Math.abs(endSelection - startSelection) > 0) { Selection.setSelection(getText(), endSelection); } } @Override public void afterTextChanged(Editable s) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { super.onTextChanged(s, start, before, count); } } 

अद्यतन करें: मैंने कोड को अपडेट किया है, क्योंकि यह ठीक से काम नहीं कर रहा था जब सैमसंग गैलेक्सी एस 6 (धन्यवाद @ जोनास ने उस टिप्पणी में इस मुद्दे के बारे में सूचित किया था) और इनुपटाइप का उपयोग करते हुए कुछ पाठ उपकरणों पर सक्षम किया है। YYPE_TEXT_FLAG_NO_SUGGESTIONS इसमें सहायता नहीं करता है ये मामला। मैंने बहुत सारे उपकरणों पर इस समाधान का परीक्षण किया है, लेकिन अभी भी यह सुनिश्चित नहीं है कि यह सभी के लिए ठीक से काम करता है या नहीं। मुझे आशा है कि EditText के किसी भी अनुचित व्यवहार के मामले में मुझे आपकी कुछ समीक्षाएं मिलेंगी

मुझे लगता है कि आप पा सकते हैं कि यदि आप उचित दृश्य / गतिविधि के dispatchKeyEvent विधि को ओवरराइड करते हैं तो आप कुंजी को रोक सकते हैं (मेरे मामले में, मुख्य गतिविधि ठीक थी)।

उदाहरण के लिए, मैं एक डिवाइस के लिए एक ऐप तैयार कर रहा हूं जिसमें हार्डवेयर स्क्रॉल कुंजियाँ हैं, और मुझे पता है कि onKeyDown / onKeyDown विधियों को कभी भी उनके लिए नहीं बुलाया जा सकता है। इसके बजाय, डिफ़ॉल्ट रूप से मुख्य प्रेस dispatchKeyEvent कीएईएवेंट के माध्यम से जाता है जब तक कि यह किसी स्क्रॉल विधि को कहीं न कहें (मेरे मामले में, विचित्र रूप से पर्याप्त, एक कुंजी प्रेस प्रत्येक दो अलग स्क्रॉल वाले दृश्यों पर एक स्क्रॉल विधियों को आमंत्रित करता है – कितना कष्टदायक)।

यदि आप बैकस्पेस वर्ण के लिए दशमलव संख्या की तरह जाँचते हैं तो क्या होगा?

मुझे लगता है कि इसकी तरह '/ आर' (दशमलव संख्या 7) या कुछ और, कम से कम एएससीआईआई के लिए

संपादित करें: मुझे लगता है कि एंड्रॉइड यूटीएफ -8 का उपयोग करता है, इसलिए यह दशमलव संख्या 8 होगी। http://www.fileformat.info/info/unicode/char/0008/index.htm

इनपैंटफ़िल्टर को बैकस्पेस के लिए बुलाया जाता है और यदि एडिटेक्ट रिक्त है।

 editText.setFilters(new InputFilter[]{new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if(source.equals("")) { //a backspace was entered } return source; } }}); 

Given the response by Umair you may consider applying a workaround here:

Capture a touch event that it's NOT a key event and happens around the lower-right part of the screen while the keyboard is shown.

एंड्रॉइड में टच की स्थिति कैसे प्राप्त करें?

क्या यह बताने का कोई तरीका है कि सॉफ्ट-कीबोर्ड दिखाया गया है?

उम्मीद है की वो मदद करदे

This is old post and giving my suggestions in case somebody is in need of super quick hack/implementation.

The simplest work around I came out with is to implement TextWatcher too along with on OnKeyListener and in onTextChanged compare with the previous existing string whether it is reduced by one character.

The benefit of this is it works on any type of keyboard with no long coding process easily.

For instance my editText holds only one character, so I compared characterSequence if it is empty string, then by that we can acknowledge that Delete key is pressed.

Below is the code explaining the same:

 @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { if(charSequence.toString().equals("")) //Compare here for any change in existing string by single character with previous string { //Carry out your tasks here it comes in here when Delete Key is pressed. } } 

Note: In this case my edittext contains only single character so I'm comparing charSequesnce with empty string(since pressing delete will make it empty), for your needs you need to modify it and compare(Like after pressing key substring is part of the original string) it with existing string. आशा करता हूँ की ये काम करेगा।