অ্যান্ড্রয়েড এডিটেক্সট মুছুন (ব্যাকস্পেস) কী ইভেন্ট


122

আমি কীভাবে সম্পাদনা পাঠের জন্য মুছুন (ব্যাকস্পেস) কী ইভেন্টটি সনাক্ত করতে পারি? আমি টেক্সটওয়াচার ব্যবহার করার চেষ্টা করেছি, কিন্তু যখন সম্পাদনা পাঠ খালি থাকে, যখন আমি মুছুন কী টিপুন, কিছুই হয় না। আমি মুছতে চাই কীগুলি মুছে ফেলতে চাই তবে এডিটেক্সট কোনও পাঠ্য না থাকলেও এডিটেক্সট প্রেরণ করুন।

উত্তর:


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
আমি এটি চেষ্টা করেই দেখেছি, তবে অনকীলিস্টেনাররা স্পষ্টতই ব্যাকস্পেসগুলি নিবন্ধন করে না।
স্টেফস

3
এটি সফট কীবোর্ডের জন্য কাজ করবে না। এটি কেবল হার্ডওয়্যার ইনপুটটির জন্য কাজ করবে।
বরুণড্রয়েড

6
আমার Nexus4 এ (চলমান স্টক কিটক্যাট) এটি সফ্টওয়্যার কীবোর্ডের জন্য কাজ করে
ম্যাথিয়াস

10
সুতরাং যদি এটি সফ্ট কীগুলির জন্য কাজ করে না, তবে কেন এই উত্তরটি অ্যান্ড্রয়েড প্ল্যাটফর্মের / অধীনে গৃহীত হবে ..
ডিজেফি

32
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DELআপনি যদি ব্যাকস্পেসের প্রতি প্রেসে দুবার গুলি
চালানোর

83

আপনি জিজ্ঞাসা করেছেন এটি একটি সময় হয়েছে কিন্তু আমার ঠিক একই সমস্যা ছিল। ইতিমধ্যে এস্টেল দ্বারা উল্লিখিত হিসাবে কী শ্রোতাদের সমস্যাটি হ'ল তারা কেবল হার্ডওয়্যার কীবোর্ড নিয়ে কাজ করে। কোনও আইএমই (সফট কীবোর্ড) দিয়ে এটি করার জন্য সমাধানটি আরও কিছুটা বিস্তৃত।

একক পদ্ধতি আমরা আসলে ওভাররাইড করতে চান sendKeyEventমধ্যে EditTextএর InputConnectionবর্গ। কোনও আইএমইতে মূল ইভেন্টগুলি ঘটে যখন এই পদ্ধতিটি বলা হয়। তবে এটিকে ওভাররাইড করার জন্য, আমাদের একটি কাস্টম প্রয়োগ করতে হবে 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এর পটভূমির রঙ পরিবর্তন করা ।

আপনি যদি এটি এক্সএমএল থেকে স্ফীত করছেন তবে পুরো প্যাকেজের নামটি ট্যাগ হিসাবে ব্যবহার করতে ভুলবেন না:

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

27
আমি সম্প্রতি জেলি বিনের একই সমস্যাটিতে ছড়িয়ে পড়েছি। আমি দেখতে পেলাম যে এই সমাধানটি বেশিরভাগ ক্ষেত্রেই কাজ করেছিল, কেবলমাত্র আমাকে সেন্ডকিউভেন্ট (...) এর পরিবর্তে মুছে ফেলুনস্রাউন্ডিংটেক্সট (...) ওভাররাইড করতে হবে which আশাকরি এটি কাউকে সাহায্য করবে!
ব্র্যান্ডন

এই উত্তরটি, উপরে @ ব্র্যান্ডনের মন্তব্যের সাথে মিলিত হয়ে আমার পক্ষে এটি কার্যকর হয়েছে। আমি এখন যা ভাবছি তা হ'ল এটি প্রাক জেলিবিয়ান ডিভাইসে কীভাবে কাজ করবে।
ক্রিস্টোফার পেরি

এটি আমার জন্য ২.২ এবং ২.৩ ডিভাইসে গৃহীত উত্তরের সাথে কাজ করে।
ক্রিস্টোফ

দেখে মনে হচ্ছে এটি ২.৩-এ দুবার ব্যাকস্পেসের মূল ইভেন্টটি চালাচ্ছে ...: /
জেফ

25
এডিটেক্সটটি খালি থাকলে এটি কাজ করে না, সম্পাদনা পাঠ ফাঁকা থাকলে এবং কী কোনও পাঠ্য না থাকলে কীভাবে মুছুন কীটির জন্য কোনও ইভেন্ট পাবেন কীভাবে কোনও ধারণা? 4.2
রিকস্টার

69

এটি ইদ্রিসের উত্তরের কেবলমাত্র একটি সংযোজন, মুছে ফেলার জন্য ওভাররাইডকে যুক্ত করে সুরাউন্টিং টেক্সটও। আমি এখানে এ সম্পর্কে আরও তথ্য পেয়েছি: অ্যান্ড্রয়েড: ওয়েবভিউ / বেসআইনপুট সংযোগে ব্যাকস্পেস

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
পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলিতে এই সমাধানটি আমার পক্ষে সত্যিই ভালভাবে কাজ করেছে, তবে দুর্ভাগ্যক্রমে মুছে ফেলা সারণে টেক্সট কেবলমাত্র ৪.৪ (কিটকেট) স্বেচ্ছাসেবী অপসারণ করার সময় বলা হয়। আমি Nexus4 এবং 7 উভয়ই পরীক্ষা করে দেখেছি
ডিন

1
দেখে মনে হয় যে ডিলিটসুরাউন্ডিংটেক্সটটি এডিট টেক্সট মাল্টিলাইন হলে প্রয়োজন হয়। অদ্ভুত
অ্যালেক্স সোরোকোলাতভ

7
ধন্যবাদ একটি টন ম্যান, মুছে ফেলুনস্রাউন্ডটেক্সট নিয়ে কাজ করেন নি। অ্যান্ড্রয়েড এতটাই এলোমেলো যে তাদের এন্ড্রোমে নামকরণ করা উচিত।
টর্স্টেন ওজাপার্ভ

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
মন্তব্যগুলিতে উল্লেখ করা হয়েছে যে, এডিটেক্সট ফাঁকা থাকলে (অন্য সমাধানগুলির মধ্যে বেশিরভাগ ক্ষেত্রে একই) এই সমাধানটি ব্যাকস্পেস প্রেসটিকে ট্র্যাক করে না।
তবে বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি যথেষ্ট।
পিএস যদি আমাকে আজকে তেমন কিছু তৈরি করতে হয় তবে আমি করতাম:

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

তারপরে এটি কেবল একটি নিয়মিত পাঠ্য ওয়াচচার হিসাবে ব্যবহার করুন:

 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

9
টেক্সটওয়াচার কোনও খালি সম্পাদনা পাঠের উপর ট্রিগার করে না
ড্যান নিয়াচু

@ লিও ড্রডকোডার আমি একই ধরণের দ্রবণে ব্যবহার করেছি। পরিষ্কার, সংক্ষিপ্ত এবং পুরোপুরি কাজ করে ... চিয়ার্স।
এজেডব্লিউ

এই অ্যালগরিদমের একটি ত্রুটি রয়েছে যেমন আপনি টাইপ করার পরে স্পেস ক্লিক করেন তবে পূর্বের দৈর্ঘ্য s.leth এর চেয়ে বেশি
মার্সিন এস

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
এটি পুরোপুরি কাজ করে না। গণনা == 0 তখনই হবে যখন সম্পাদনাটি ফাঁকা থাকবে!
লিও ড্রয়েডকোডার

@ মারাক অ্যালেক্সান্ডার এই উত্তর সম্পর্কে আমি নিশ্চিত নই, তবে আপনি উপরের উত্তরে আমার সমাধানটি পরীক্ষা করতে পারেন
লিও ড্রয়েডকোডার

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

টেক্সট চেঞ্জলিস্টনার এমপটেক্সটভিউতে কখনও কল করেনি।
জনার্দন আর

3

টেক্সটওয়াচারের সাহায্যে সম্পাদনা পাঠের উদাহরণ

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

কাস্টম টেক্সট ওয়াচার

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এমনকি সফট কীবোর্ড বা হার্ডকিবোর্ডেও কাজ করেছেন! কিন্তু শুধু কিছু ডিভাইসের । আমার ক্ষেত্রে এটি স্যামসাং এস 8 এ কাজ করে তবে শাওমি এমআই 8 সেটে কাজ করে না।

যদি আপনি কোটলিন ব্যবহার করেন, আপনি ক্রসলাইন ফাংশন ব্যবহার করতে পারেন doOnTextChanged, এটি একই addOnTextChangedতবে কলব্যাকটি ট্রিগার করে এমনকি সম্পাদনা পাঠ্যটি খালি ছিল।

দ্রষ্টব্য: doOnTextChanged অ্যান্ড্রয়েড কেটিএক্স লাইব্রেরির একটি অংশ


2
আপনি সম্ভবত উল্লেখ করতে পারেন যে doOnTextChanged এক্সটেনশন ফাংশনটি অ্যান্ড্রয়েড কেটিএক্স লাইব্রেরিতে অ্যাক্সেসযোগ্য
প্রস্তর

2
তবে মনে হচ্ছে কলব্যাক "ট্রিগারযুক্ত এমনকি সম্পাদনা পাঠ্য খালি ছিল না"। আপনি দয়া করে খালি জন্য মুছে ফেলা (ব্যাকস্পেস) ইন্টারসেপশন কিছু স্নিপেট প্রদান করতে পারেন EditText? অগ্রিম ধন্যবাদ
পাথর

1
আহা, আমি যখন কোনও প্রকল্পের বিকাশ করি তখন তা পরীক্ষা করে দেখি। আমার ক্ষেত্রে জিয়াওমি এমআই 8 তে রয়েছে, যখন সম্পাদনাটি খালি থাকে এবং আপনি মুছুন চাপুন, কোনও কলব্যাক বরখাস্ত হয়নি। আমি এই বাক্যটির জন্য স্নিপেট অনুসন্ধান করব।
Mành Hoàng Huynh

0

স্ট্যাকওভারফ্লোতেও একই রকম প্রশ্ন রয়েছে। পদ্ধতিতে থাকা অবজেক্টটিতে EditTextঅ্যাক্সেস পাওয়ার জন্য আপনাকে ওভাররাইড করতে হবে । এটি আপনাকে মুছে ফেলার (ব্যাকস্পেস) ইভেন্ট সনাক্ত করতে সহায়তা করবে। দয়া করে, আমি সেখানে সরবরাহ করেছি এমন সমাধানটি একবার দেখুন - নরম করে ব্যাকস্পেস / ডিলিট প্রেস ক্যাপচার করতে পারে না। কীবোর্ডInputConnectiondeleteSurroundingText


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

ডায়ালগেও আমি একই সমস্যার মুখোমুখি হয়েছি .. কারণ আমি সেটঅনকি লাইস্টেনার ব্যবহার করছি .. তবে আমি ডিফল্ট প্রত্যাবর্তনকে সত্য বলে সেট করেছি। নীচের কোডের মতো পরিবর্তনের পরে এটি আমার পক্ষে ভাল কাজ করছে ..

    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

@ জিফের ভিত্তিতে ZanyEditTextএখানে রয়েছে WiseEditTextwithsetSoftKeyListener(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 এ, এটি ভালভাবে কাজ করে। তবে ৪.৪-তে এটি কার্যকর হয় না।

আমি এই সমস্যাটি ঘিরে কাজ করার একটি সহজ উপায় পেয়েছি। মূল বিষয়টি হ'ল শুরুতে সম্পাদনা পাঠের সামগ্রীটিতে একটি অদৃশ্য চরিত্র sertোকানো এবং ব্যবহারকারীকে এই চরিত্রের আগে কার্সারটি সরাতে না দিন। আমার উপায়টি হল শূন্য প্রস্থের একটি ইমেজস্প্যান সহ একটি সাদা-স্পেস অক্ষর characterোকানো। এখানে আমার কোড।

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

এবং আমাদের পছন্দসই একটি সম্পাদনা পাঠ্য প্রয়োজন যার একটি নির্বাচনকেন্দ্রলিস্টনার রয়েছে

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

এবং এখন, আমরা সম্পন্ন করেছি Edit এডিট টেক্সটের কোনও আসল সামগ্রী না থাকলে আমরা ব্যাকস্পেস কী ইভেন্টটি সনাক্ত করতে পারি এবং ব্যবহারকারী আমাদের কৌশল সম্পর্কে কিছুই জানতে পারবেন না।


0

এই প্রশ্নটি পুরানো হতে পারে তবে একটি পাঠ্য ওয়াচচার ব্যবহার করে উত্তরটি খুব সহজ।

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

পূর্ববর্তী সমাধানগুলির মতো, স্ব-পরিপূর্ণ / পরামর্শ দ্বারা এটি ট্রিগার করা যেতে পারে।
স্টোনজ 2

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 ক্রিয়ায় ফেলে দেওয়া হবে। উদাহরণস্বরূপ, যখন সম্পাদনা পাঠ্যে কোনও পাঠ্য নেই বা কিছু পাঠ্য রয়েছে তবে কার্সারটি খুব শুরুতেই রয়েছে। মজার বিষয় এটি যে আমার ক্ষেত্রে আমার ঠিক সেই আচরণটি প্রয়োজন
আন্তন কিজেমা

আমার ক্রিয়াকলাপে কোনও সম্পাদনা পাঠ্য নেই এবং আমি কীবোর্ডটিকে প্রোগ্রামিয়ালি প্রদর্শিত করতে পারি। আমাকে প্রতিটি নরম কীবোর্ড কী ধরতে হবে এবং এটিই কেবল কার্যকর সমাধান বলে মনে হচ্ছে। অন্যটি ডিসপ্যাচকিএভেন্ট পদ্ধতিটি ওভাররাইড করছে। দুর্ভাগ্যক্রমে জেলিবিয়ান থেকে শুরু করে আইএমই মুছে ফেলার কীটির জন্য কোনও কীভেন্ট পাঠায় না। বিকাশকারী.অ্যান্ড্রয়েড.
com
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.