অ্যান্ড্রয়েড এডিটেক্সট - টাইপিংয়ের ইভেন্ট সমাপ্ত


122

ব্যবহারকারী সম্পাদনা পাঠ্য সম্পাদনা শেষ করলে আমি একটি ইভেন্ট ধরতে চাই।

এটা কিভাবে করা যাবে?


1
@ পদ্মকুমার সবচেয়ে প্রাকৃতিক উপায় হ'ল যদি সম্পাদনা পাঠের উপরে ফোকাসটি নষ্ট হয়ে যায় - তবে ব্যবহারকারীটি অবশ্যই নিশ্চিত হয়ে যায়, তবে অভিজ্ঞতা থেকে মনে হয় যে সমস্ত অ্যান্ড্রয়েড উইজেটগুলি সঠিকভাবে ফোকাস ধরেছে না (স্পিনার এবং বোতামগুলির সাথে আমার এই সমস্যাগুলি ছিল) - তাই অন্যান্য উইজেট না ফোকাস হেরেছেন ... হয়তো
AgentKnopf

3
এত বড় প্ল্যাটফর্ম কেন আমাদের এই ধরণের সাধারণ ফাংশনগুলি মোকাবেলা করতে দেয়? তারা কমপক্ষে তাদের সমর্থন লাইব্রেরিতে এ জাতীয় প্রধান বৈশিষ্ট্যগুলি যুক্ত করলে গুগল কিছুই হারাবে না
এমবিএইচ

আপনি যদি স্ট্রিং ব্যবহারকারীর প্রবেশের সঠিক দৈর্ঘ্যটি জানেন তবে টেক্সটচ্যাঞ্জডে পাঠ্যটি পান। উদা:override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
শৈলেন্দ্র মাদদা

2
আমি আশ্চর্য হয়ে আমার মাথাটি আঁচড়িয়ে দিচ্ছি যে এন্ড্রয়েডে এটি এতই কঠিন যে আমাদের (নিজেরাই অন্তর্ভুক্ত) 10+ লাইন কোডের লাইন দিয়ে একটি অনলাইন আলোচনা এবং বিভিন্ন সমাধান সন্ধান করা এবং শুরু করা দরকার ..?
nsandersen

উত্তর:


119

ব্যবহারকারীর সম্পাদনা শেষ হয়ে গেলে, সে টিপবে DoneবাEnter

((EditText)findViewById(R.id.youredittext)).setOnEditorActionListener(
    new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH ||
                    actionId == EditorInfo.IME_ACTION_DONE ||
                    event != null &&
                    event.getAction() == KeyEvent.ACTION_DOWN &&
                    event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                if (event == null || !event.isShiftPressed()) {
                   // the user is done typing. 

                   return true; // consume.
                }                
            }
            return false; // pass on to other listeners. 
        }
    }
);

50
আপনি কি এটি সম্পর্কে নিশ্চিত হতে পারেন? আমার পরবর্তী সম্পাদনযোগ্য ক্ষেত্রে / এ আলতো চাপার অভ্যাস আছে - আমি কখনও কখনও এন্টার / ডোন চাপতাম না - এবং আমরা আমাদের গ্রাহকদের কাছ থেকে যা দেখেছি, সেগুলিও না ... আমি এডিটেক্সটস / কম্বোবক্সেস ইত্যাদির তালিকার কথা বলছি am আপনি যদি কেবল ব্যবহারকারীকে একটি ইনপুট ক্ষেত্র দেন এবং অন্য ক্ষেত্রগুলিতে অগ্রসর হওয়ার আগে তাকে একটি বোতাম টিপতে বাধ্য করেন তবে তা স্পষ্টতই অন্যরকম একটি গল্প ...
এজেন্টকনপফ

5
মনে রাখবেন, আপনার এন্ড্রয়েড থাকতে হবে: আপনার সম্পাদনা পাঠ্যের জন্য সিঙ্গললাইন = "সত্য" সেট রয়েছে। ধন্যবাদ স্ট্যাকওভারফ্লো.com
স্টিভেন স্মিথ

1
ভাল সমাধান তবে নাল পয়েন্টার সহ ক্র্যাশ হতে পারে ... 'ইভেন্ট' ডোন অ্যাকশনে নালাগুলি ঘটতে পারে তাই ইভেন্ট.আইএসফটপ্রেসড () ক্র্যাশ হয়ে গেছে। আপনি যদি এটি ব্যবহার করে নাল পয়েন্টার চেক যোগ করুন।
জর্জি

নাল "ইভেন্ট" চেক করতে সম্পাদনা যুক্ত করা হয়েছে।
ওয়ার্ড রিয়ারঞ্জার

3
যদি আপনি কীবোর্ডটি বন্ধ করে দেয় এমন পিঠ বোতামটি আঘাত করেন?
ব্যবহারকারী 347187

183

আরও ভাল উপায়, আপনি ব্যবহারকারীরা সম্পাদনা করেছেন কিনা তা পরীক্ষা করতে শ্রোতাগুলিতে ফোসকেনচার এডিটেক্সটও ব্যবহার করতে পারেন: (সফট কীবোর্ডের ডোন বা এন্টার বোতাম টিপে ব্যবহারকারী নির্ভর করে না)

 ((EditText)findViewById(R.id.youredittext)).setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {

      // When focus is lost check that the text field has valid values.

      if (!hasFocus) { {
         // Validate youredittext
      }
    }
 });

দ্রষ্টব্য: একাধিক সম্পাদনা পাঠের জন্য, আপনি নিজের শ্রেণিটি কার্যকর করতে দিতে পারেন তবে আপনার View.OnFocusChangeListenerপ্রত্যেকেরই সম্পাদনা পাঠ্য শ্রোতাকে সেট করতে এবং নীচের মতো এটিকে বৈধতা দিন

((EditText)findViewById(R.id.edittext1)).setOnFocusChangeListener(this);
((EditText)findViewById(R.id.edittext2)).setOnFocusChangeListener(this);

    @Override
    public void onFocusChange(View v, boolean hasFocus) {

      // When focus is lost check that the text field has valid values.

      if (!hasFocus) {
        switch (view.getId()) {
           case R.id.edittext1:
                 // Validate EditText1
                 break;
           case R.id.edittext2:
                 // Validate EditText2
                 break;
        }
      }
    }

60
কেবলমাত্র দৃষ্টি নিবদ্ধযোগ্য যদি এটি কাজ করে না EditText। এটি কখনই মনোযোগ হারাবে না।
বার্ট ফ্রেডারিচস

আমাদের যদি কেবল একটিই থাকে তবে সবচেয়ে ভাল উপায় কী EditText? আমার কি ব্যবহার করতে হবে onEditorAction?
Tux

3
যদি কেবল একটিই থাকে EditText, ব্যবহারকারী স্ক্রিনটি ছেড়ে যা যা করতে তা যাচাই করে নিন।
ক্রিস্টিন

আমি এটি চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি। আমি যখনই এন্টার W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }টিপতাম ততবারই এটি আমাকে অনুরূপ বার্তা দেয়: যদিও আমি কিছু টাইপ করেছি This এটি এমন একটি সম্পাদনা যা কেবল সংখ্যা গ্রহণ করে।
ahitt6345

1
অনফোকাস চেঞ্জ শ্রোতার ব্যবহারের একটি দিক রয়েছে: এডিটেক্সটটিতে ফোকাস থাকলে এবং ডিভাইসটি ঘোরানো হলে এটি কল হবে না! আমি এটি বন্ধ করুন () এর ক্রিয়াকলাপগুলিতে কিছু অন্য-ভিউ.রেকুয়েস্টফোকস () লাগিয়ে সমাধান করেছি। (সুপার.অনপোজ () এর আগে) এইভাবে এটি নিরাপদ যে এডিট টেক্সট ফোকাস হারিয়ে ফেলে এবং শ্রোতাদের ডেকে আনে।
allofmex

60

আমি ব্যক্তিগতভাবে টাইপিং শেষে স্বয়ংক্রিয় জমা দিতে পছন্দ করি। আপনি কীভাবে এই ইভেন্টটি সনাক্ত করতে পারেন তা এখানে।

ঘোষণা এবং সূচনা:

private Timer timer = new Timer();
private final long DELAY = 1000; // in ms

শ্রোতা উদাঃ onCreate ()

EditText editTextStop = (EditText) findViewById(R.id.editTextStopId);
    editTextStop.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }
        @Override
        public void onTextChanged(final CharSequence s, int start, int before,
                int count) {
            if(timer != null)
                timer.cancel();
        }
        @Override
        public void afterTextChanged(final Editable s) {
            //avoid triggering event when text is too short
            if (s.length() >= 3) {              

                timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        // TODO: do what you need here (refresh list)
                        // you will probably need to use
                        // runOnUiThread(Runnable action) for some specific
                        // actions
                        serviceConnector.getStopPoints(s.toString());
                    }

                }, DELAY);
            }
        }
    });

সুতরাং, পাঠ্য পরিবর্তন করা হলে টাইমার পরবর্তী কোনও পরিবর্তন হওয়ার জন্য অপেক্ষা করতে শুরু করে। যখন এগুলি ঘটে টাইমার বাতিল হয়ে যায় এবং তারপরে আবার শুরু হয়।


11
এটি দুর্দান্ত, তবে সাবধান থাকুন যে টাইমারগুলি মেমরি ফাঁস হতে পারে তার Handlerপরিবর্তে ব্যবহার করুন
মোহ মাহ

থানস্ক, দুর্দান্ত।
ভিআইপিপঙ্কজোশার্স ড্রুপ

সার্ভিস কানেক্টর কী?
পরোপকারী

@ লল্ট্রুস্টিক এটি আমার কোডের কেবলমাত্র খণ্ডন যা থেকে আমি উত্তরটি বের করেছি। এটি সেই জায়গা যেখানে যুক্তিটি করা উচিত।
জিমাএক্সএক্সএক্সএক্স

21

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

পাঠ্য প্রহরী সেট করুন editText.addTextChangedListener(textWatcher);

তারপরে ফোন করুন

private TextWatcher textWatcher = new TextWatcher() {

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

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

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

27
আমি আশঙ্কা করছি এটি (সম্পূর্ণ) সমাধান নয় - প্রতিটি সম্পাদনার পরে টেক্সট ওয়াচারটি আগুন ধরিয়ে দেয় - আপনি যদি হ্যালো টাইপ করেন তবে এটি h, e, l, l এবং o এর জন্য আগুন লাগবে - ব্যবহারকারী কখন "সম্পন্ন" হয় তা সত্যই জানে না । দুর্দান্ত হবে যদি টেক্সট ওয়াচারটি আসলে জানতে পারে কখন উইজেট ফোকাস হারিয়েছে এবং ব্যবহারকারী এগিয়ে
চলেছে

4

যদিও অনেক উত্তর সঠিক দিক নির্দেশ করে আমার মনে হয় প্রশ্নটির লেখক কী ভাবছেন সেগুলির কোনও উত্তর দেয় না। বা কমপক্ষে আমি প্রশ্নটি অন্যরকমভাবে বুঝতে পেরেছিলাম কারণ আমি অনুরূপ সমস্যার উত্তর খুঁজছিলাম। সমস্যাটি হল "ব্যবহারকারী কীভাবে তাকে বোতাম টিপে না ফেলে টাইপ করা বন্ধ করে দেয়" কীভাবে তা জানবেন এবং কিছু ক্রিয়াকলাপ ট্রিগার করে (উদাহরণস্বরূপ স্বয়ংক্রিয়-সম্পূর্ণ)। আপনি যদি এটি করতে চান তবে টেক্সট-এ টাইমারটি বিলম্বের সাথে পরিবর্তিত হয়েছিলেন যা আপনি ব্যবহারকারী টাইপ করা বন্ধ করে বিবেচনা করবেন (উদাহরণস্বরূপ 500-700 মিমি), আপনি টাইমার শুরু করার সাথে সাথে প্রতিটি টাইম আগেরটি বাতিল করে দেয় (বা কমপক্ষে কোনও প্রকারের ব্যবহার করুন) ফ্ল্যাগ করুন যে তারা যখন টিক দেয় তখন তারা কিছু করেন না)। এখানে আমি যা ব্যবহার করেছি তার অনুরূপ কোড:

new Timer().schedule(new TimerTask() {
  @Override
  public void run() {
     if (!running) {                            
        new DoPost().execute(s.toString());
  });
 }
}, 700);

নোট করুন যে আমি আমার অ্যাসিঙ্ক টাস্কের অভ্যন্তরে চলমান বুলিয়ান পতাকাটি সংশোধন করেছি (অটো-সম্পূর্ণ হওয়ার জন্য টাস্ক সার্ভার থেকে জসন পায়)।

এছাড়াও মনে রাখবেন যে এটি অনেকগুলি টাইমার টাস্ক তৈরি করে (আমি মনে করি তারা একই থ্রেডের ভিত্তিতে নির্ধারিত হয়েছে তবে এটি পরীক্ষা করে দেখতে হবে), সম্ভবত উন্নতির জন্য অনেকগুলি জায়গা রয়েছে তবে এই পদ্ধতির কাজও হয় এবং নীচের অংশটি হ'ল আপনার উচিত টাইমার ব্যবহার করুন যেহেতু কোনও "ব্যবহারকারী টাইপ ইভেন্ট বন্ধ করে" নেই


আপনি কি দয়া করে এ সম্পর্কে আরও তথ্য এবং নমুনা কোড দিতে পারেন?
জন আর্নেস্ট গুয়াদালাপে

কোডটির সূচনা উত্তরে রয়েছে, আরও বিস্তারিত উদাহরণের জন্য দয়া করে একই পাতায় জিম্যাক্সএক্সএক্সএক্স উত্তরটি দেখুন যা একই পদ্ধতির ব্যবহার করে। আমি জানি না যে আমি আর কী তথ্য যুক্ত করতে পারি, আপনি যদি নির্দিষ্ট করে না পারেন তবে যা পরিষ্কার নয় আমি বিশদ যুক্ত করার চেষ্টা করব।
ইগোর Čordaš

4

ক্রিয়াকলাপের পরে কী-বোর্ডটি আড়াল করতে চাইলে @ রেনো এবং @ বিনায়াক বি উভয়ই এক সাথে উত্তর দেয়

textView.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(textView.getWindowToken(), 0);
            return true;
        }
        return false;
    }
});

textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
             // your action here
        }
    }
});

3

একটি ভিন্ন পদ্ধতির ... এখানে একটি উদাহরণ: ব্যবহারকারী টাইপ করার সময় যদি 600-1000 মিমি দেরি করে থাকেন তবে আপনি বিবেচনা করতে পারবেন তিনি বন্ধ হয়ে গিয়েছেন।

 myEditText.addTextChangedListener(new TextWatcher() {
             
            private String s;
            private long after;
			private Thread t;
            private Runnable runnable_EditTextWatcher = new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        if ((System.currentTimeMillis() - after) > 600)
                        {
                            Log.d("Debug_EditTEXT_watcher", "(System.currentTimeMillis()-after)>600 ->  " + (System.currentTimeMillis() - after) + " > " + s);
                            // Do your stuff
                            t = null;
                            break;
                        }
                    }
                }
            };
            
            @Override
            public void onTextChanged(CharSequence ss, int start, int before, int count) {
                s = ss.toString();
            }
            
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            
            @Override
            public void afterTextChanged(Editable ss) {
                after = System.currentTimeMillis();
                if (t == null)
                {
                    t = new Thread(runnable_EditTextWatcher);
                      t.start();
                }
            }
        });


2

ঠিক আছে এটি নিশ্চিতভাবে 100% কাজ করবে।

কীবোর্ডটি দেখানো বা লুকানো থাকলে প্রথমে আপনাকে শ্রোতাদের সেটআপ করতে হবে। যদি কীবোর্ডটি প্রদর্শিত হয় তবে সম্ভবত ব্যবহারকারী টাইপ করছেন, অন্যথায় টাইপ করা হয়েছে।

final View activityRootView = findViewById(android.R.id.content);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {

                    Rect r = new Rect();
                    //r will be populated with the coordinates of your view that area still visible.
                    activityRootView.getWindowVisibleDisplayFrame(r);

                    int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...

                        isTyping = true;
                    } else {
//to make sure this will call only once when keyboard is hide.
                        if(isTyping){
                            isTyping = false;
                        }
                    }
            }
        });

1
একাধিক পাঠ্য সম্পাদনা সম্পর্কে কী? এবং heightDiff > 100স্টাফ ভীতিজনক imho।
বোন্ডাক্স

কোন সমস্যা নেই, এটা ঠিক আছে। এই স্ট্যাকওভারফ্লোটি দেখুন
প্রশ্নগুলি /

2

আমি এইভাবে এই সমস্যাটি সমাধান করেছি। আমি কোটলিন ব্যবহার করেছি।

        var timer = Timer()
        var DELAY:Long = 2000

        editText.addTextChangedListener(object : TextWatcher {

            override fun afterTextChanged(s: Editable?) {
                Log.e("TAG","timer start")
                timer = Timer()
                timer.schedule(object : TimerTask() {
                    override fun run() {
                        //do something
                    }
                }, DELAY)
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                Log.e("TAG","timer cancel ")
                timer.cancel() //Terminates this timer,discarding any currently scheduled tasks.
                timer.purge() //Removes all cancelled tasks from this timer's task queue.
            }
        })

0

আমারও একই সমস্যা ছিল এবং সম্পন্ন বা এন্টার টিপে ব্যবহারকারীর উপর নির্ভর করতে চাই না।

আমার প্রথম চেষ্টা ছিল অন ফোকাস চেঞ্জ শ্রোতার ব্যবহার করা, তবে এটি ঘটেছিল যে আমার সম্পাদনা পাঠটি ডিফল্টরূপে ফোকাস পেয়েছে। ব্যবহারকারী যখন অন্য কোনও ভিউ চাপা দেয়, তখন ব্যবহারকারীরা এটিকে ফোকাসটি নির্ধারণ না করেই ফোকাস চেঞ্জটি ট্রিগার করে।

পরবর্তী সমাধানটি এটি আমার জন্য করেছিল, যেখানে ব্যবহারকারী সম্পাদনা পাঠ্য স্পর্শ করলে অনফোকাস চেঞ্জ যুক্ত থাকে:

final myEditText = new EditText(myContext); //make final to refer in onTouch
myEditText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            myEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if(!hasFocus){
                        // user is done editing
                    }
                }
            }
        }
}

আমার ক্ষেত্রে, ব্যবহারকারীর স্ক্রিন সম্পাদনার কাজটি পুনরায় রেন্ডার করা হয়েছিল, যার ফলে আমার এডিটটেক্সট অবজেক্টটি পুনর্নবীকরণ করা হবে। যদি একই অবজেক্টটি রাখা হয়, তবে এই পোস্টের শুরুতে বর্ণিত অনফোকাস চেঞ্জ সমস্যাটি রোধ করতে আপনার সম্ভবত ফোকাস চেঞ্জের শ্রোতাদের অপসারণ করা উচিত remove


প্রতিবার কোনও স্পর্শ ইভেন্ট হওয়ার সাথে সাথে আপনি একটি ফোকাস পরিবর্তন শ্রোতাকে সেট করছেন যা সেকেন্ডে কয়েকবার হবে। এটা করো না.
jsonfry

0

চ্যাট অ্যাপে 'এখন টাইপিং' প্রয়োগ করার চেষ্টা করার সময় আমার একই সমস্যা হয়েছিল। নীচে এডিটেক্সট প্রসারিত করার চেষ্টা করুন:

public class TypingEditText extends EditText implements TextWatcher {

private static final int TypingInterval = 2000;


public interface OnTypingChanged {
    public void onTyping(EditText view, boolean isTyping);
}
private OnTypingChanged t;
private Handler handler;
{
    handler = new Handler();
}
public TypingEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.addTextChangedListener(this);
}

public TypingEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.addTextChangedListener(this);
}

public TypingEditText(Context context) {
    super(context);
    this.addTextChangedListener(this);
}

public void setOnTypingChanged(OnTypingChanged t) {
    this.t = t;
}

@Override
public void afterTextChanged(Editable s) {
    if(t != null){
        t.onTyping(this, true);
        handler.removeCallbacks(notifier);
        handler.postDelayed(notifier, TypingInterval);
    }

}

private Runnable notifier = new Runnable() {

    @Override
    public void run() {
        if(t != null)
            t.onTyping(TypingEditText.this, false);
    }
};

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


@Override
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { }

}


0

আমি তাকে একই সমস্যার সাথে শেষ করেছি এবং আমি সমাধানটি ওডিটর অ্যাকশন বা ফোকাস চেঞ্জ দিয়ে ব্যবহার করতে পারিনি এবং টাইমার চেষ্টা করতে চাইনি। সমস্ত থ্রেড এবং খুব অবিশ্বাস্যর কারণে একটি টাইমার স্বাদযুক্ত হতে পারে এটির পক্ষে বিপজ্জনক, কারণ আপনার কোডটি কখন কার্যকর করা হয় তা আপনি জানেন না।

অন-এডিটরএকশনটি যখন ব্যবহারকারী কোনও বোতাম ব্যবহার না করে ছেড়ে যায় এবং আপনি যদি এটি ব্যবহার করেন তবে দয়া করে লক্ষ্য করুন যে কী-এভেন্ট নਾਲ হতে পারে। ফোকাস উভয় প্রান্তে অবিশ্বাস্য হয় ব্যবহারকারী কোনও পাঠ্য প্রবেশ না করে বা ক্ষেত্রটি নির্বাচন না করে ফোকাস পেতে এবং ছেড়ে যেতে পারে এবং ব্যবহারকারীর শেষ সম্পাদনা ক্ষেত্রটি ছেড়ে যাওয়ার দরকার নেই need

আমার সমাধান অনফোকাস চেঞ্জ এবং একটি পতাকা সেট ব্যবহার করে যখন ব্যবহারকারী পাঠ্য সম্পাদনা শুরু করে এবং শেষ ফোকাস করা ভিউ থেকে পাঠ্যটি পেতে কোনও ফাংশন, যা আমি যখন প্রয়োজনবোধে কল করি।

আমি কেবল আমার সমস্ত পাঠ্য ক্ষেত্রের উপর ফোকাস সাফ করে দিয়েছি বাম পাঠ্য ভিউ কোডটি ট্র্যাক করতে, ক্লিয়ারফোকাস কোডটি কেবলমাত্র কার্যকর করা হয় যদি ক্ষেত্রটির ফোকাস থাকে। আমি onSaveInstanceState এ ফাংশনটি কল করি তাই আমাকে সম্পাদনা পাঠের দৃশ্যের হিসাবে এবং গুরুত্বপূর্ণ বোতামগুলি ক্লিক করা হয় এবং যখন কার্যকলাপটি বন্ধ থাকে তখন পতাকাটি (এমডিটিং) সংরক্ষণ করতে হবে না।

টেক্সট ওয়াচারের সাথে সতর্ক থাকুন কারণ এটি প্রায়শই কল হয় estআরস্টোরইনস্ট্যান্স স্টেট কোডটি পাঠ্যে প্রবেশ করার সময় আমি প্রতিক্রিয়া না জানাতে ফোকাসের শর্তটি ব্যবহার করি। আমি

final EditText mEditTextView = (EditText) getView();

    mEditTextView.addTextChangedListener(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) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            if (!mEditing && mEditTextView.hasFocus()) {
                mEditing = true;
            }
        }
    });
    mEditTextView.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus && mEditing) {
                mEditing = false;
                ///Do the thing
            }
        }
    });
protected void saveLastOpenField(){
    for (EditText view:getFields()){
            view.clearFocus();
    }
}

0

আমি এই বিমূর্ত শ্রেণীর মতো কিছু করেছি যা টেক্সটভিউ.অনএডিটরঅ্যাকশনলিস্টনার ধরণের জায়গায় ব্যবহার করা যেতে পারে।

abstract class OnTextEndEditingListener : TextView.OnEditorActionListener {

    override fun onEditorAction(textView: TextView?, actionId: Int, event: KeyEvent?): Boolean {

        if(actionId == EditorInfo.IME_ACTION_SEARCH ||
                actionId == EditorInfo.IME_ACTION_DONE ||
                actionId == EditorInfo.IME_ACTION_NEXT ||
                event != null &&
                event.action == KeyEvent.ACTION_DOWN &&
                event.keyCode == KeyEvent.KEYCODE_ENTER) {

            if(event == null || !event.isShiftPressed) {
                // the user is done typing.
                return onTextEndEditing(textView, actionId, event)
            }
        }
        return false // pass on to other listeners
    }

    abstract fun onTextEndEditing(textView: TextView?, actionId: Int, event: KeyEvent?) : Boolean
}

0

এডিট টেক্সট এ টাইপিং ফিনিস সহজ

আমার জন্য কাজ করেছেন, যদি আপনি জাভা ব্যবহার করেন তবে এটি রূপান্তর করুন

কোটলিনে

youredittext.doAfterTextChanged { searchTerm ->
val currentTextLength = searchTerm?.length
    Handler().postDelayed({
        if (currentTextLength == searchTerm?.length) {
            // your code 
           Log.d("aftertextchange", "ON FINISH TRIGGER")
          }
       }, 3000)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.