2016-02-05 13 views
8

में टाइप करना बंद करने का तरीका कैसे पता चलता है मेरे पास मेरे लेआउट में एक संपादन टेक्स्ट फ़ील्ड है। जब उपयोगकर्ता उस संपादन में टाइप करना बंद कर देता है तो मैं एक क्रिया करना चाहता हूं। मैं TextWatcher कार्यान्वित किया है और का उपयोग कर यह काम करता हैउपयोगकर्ताओं को एडिटटेक्स्ट एंड्रॉइड

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


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

@Override 
    public void afterTextChanged(Editable editable) { 

    } 

समारोह onTextChanged और afterTextChanged बस किसी भी चरित्र लिखने के बाद कहा जाता हो, लेकिन मैं काम करवाना चाहते हैं के बाद उपयोगकर्ता कि edittext क्षेत्र में टाइपिंग बंद कर दिया, करता है वैसे ही जैसे फेसबुक पर यह " चेक इन "पेज।

मैं इसे कैसे कार्यान्वित कर सकता हूं, कृपया मुझे बताएं कि किसी के पास कोई विचार है या नहीं।

उन्नत में एक टन धन्यवाद।

उत्तर

12

इस तरह मैंने किया और मेरे लिए काम किया!

long delay = 1000; // 1 seconds after user stops typing 
long last_text_edit = 0; 
Handler handler = new Handler(); 

private Runnable input_finish_checker = new Runnable() { 
    public void run() { 
     if (System.currentTimeMillis() > (last_text_edit + delay - 500)) { 
      // TODO: do what you need here 
      // ............ 
      // ............ 
      DoStaff(); 
     } 
    } 
}; 

EditText editText = (EditText) findViewById(R.id.editTextStopId); 
editText.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){ 
     //You need to remove this to run only once 
     handler.removeCallbacks(input_finish_checker); 

    } 
    @Override 
    public void afterTextChanged (final Editable s){ 
     //avoid triggering event when text is empty 
     if (s.length() > 0) { 
      last_text_edit = System.currentTimeMillis(); 
      handler.postDelayed(input_finish_checker, delay); 
     } else { 

     } 
    } 
} 

); 
2

यह एक अलग तरह का दृष्टिकोण है। लेकिन आप इस तरह की कुछ कर सकते हैं

मुझे लगता है कि उपयोगकर्ता ने संपादन में टाइप करना शुरू कर दिया था, और उसने किसी विशेष समयावधि के लिए टाइप नहीं किया था, क्योंकि इसे माना जा सकता था कि उसने टाइप करना बंद कर दिया था।

editText.addTextChangedListener(new TextWatcher() { 

     boolean isTyping = false; 

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

     private Timer timer = new Timer(); 
     private final long DELAY = 5000; // milliseconds 

     @Override 
     public void afterTextChanged(final Editable s) { 
      Log.d("", ""); 
      if(!isTyping) { 
       Log.d(TAG, "started typing"); 
       // Send notification for start typing event 
       isTyping = true; 
      } 
      timer.cancel(); 
      timer = new Timer(); 
      timer.schedule(
        new TimerTask() { 
         @Override 
         public void run() { 
          isTyping = false; 
          Log.d(TAG, "stopped typing"); 
          //send notification for stopped typing event 
         } 
        }, 
        DELAY 
      ); 
     } 
    }); 

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

+0

मुझे व्यक्तिगत रूप से इस दृष्टिकोण को पसंद नहीं है, क्या होगा यदि उपयोगकर्ता टेक्स्ट दर्ज करते समय एक दोस्त के साथ बात कर रहा है और टाइपिंग बंद कर देता है? आप समय को बढ़ाकर इसे ठीक कर सकते हैं लेकिन फिर वांछित प्रभाव खो जाएगा। – Hughzi

+0

लेकिन यह निष्कर्ष निकालने का कोई बेहतर तरीका नहीं है कि वह टाइप कर रहा है या नहीं। –

+0

वहां है, अगर उन्होंने संपादन टेक्स्ट से दूर ध्यान केंद्रित किया है तो वे संभवतः टाइप नहीं कर सकते हैं, – Hughzi

4

आप फोकस चेंज श्रोता का उपयोग कर सकते हैं। edittext ध्यान केंद्रित है, तो उपयोगकर्ता अभी भी अन्यथा संपादन वे बंद कर दिया है मान लेते हैं और आप अपने कार्यवाही नहीं कर सकता:

EditText et = new EditText(mContext); 
    et.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean hasFocus) { 
      if (hasFocus) { 
       //user has focused 
      } else { 
       //focus has stopped perform your desired action 
      } 
     } 
    }); 
-4

कोड मदद bellow सकता है आप

yourEdiTtext.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) { 
       //Write your code for on change in edittext 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
0

मैं एक CountDownTimer इस्तेमाल किया उपयोगकर्ता अगर पता लगाने के लिए थोड़ी देर के बाद टाइपिंग बंद कर दिया। मुझे मदद करने की उम्मीद है।

yourEditText.addTextChangedListener(new TextWatcher() { 

     CountDownTimer timer = null; 

     @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 (timer != null) { 
       timer.cancel(); 
      } 

      timer = new CountDownTimer(1500, 1000) { 

       public void onTick(long millisUntilFinished) { 
       } 

       public void onFinish() { 

        //do what you wish 

       } 

      }.start(); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
5

RxBindings Android के लिए का उपयोग कर ऐसा करने का एक बहुत ही सरल और आसान तरीका है,

पुस्तकालय प्राप्त करता है, तो आप पहले से ही नहीं है,

compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' 

जोड़ें और को यह टुकड़ा संशोधित आपकी ज़रूरतें,

RxTextView.textChanges(mEditText) 
      .debounce(3, TimeUnit.SECONDS) 
      .subscribe(textChanged -> { 
       Log.d("TAG", "Stopped typing!"); 
      }); 

डिबॉन्स ऑपरेटर क्या है? - Learn more about it here

हमारे संदर्भ में, debounce केवल आप EditText के अंदर का पाठ परिवर्तन की के बाद एक निश्चित समय के पिछले पाठ परिवर्तन यह है कि EditText अंदर हुआ से पारित कर दिया है सूचित करेंगे।

यहां मैं 3 सेकंड का इंतजार कर रहा हूं जब तक कि अंतिम पाठ परिवर्तन निष्कर्ष निकाला न जाए कि उपयोगकर्ता ने टाइप करना बंद कर दिया है। आप इसे अपनी आवश्यकताओं के अनुसार संशोधित कर सकते हैं।

संबंधित मुद्दे