2016-12-01 85 views
1

当用户停止输入后,我必须运行一次函数,但我的函数运行多次。我检测到用户停止时打字,但不能只执行一次我的功能。当用户停止输入但我的函数运行多次时,我必须运行一次函数

@Override 
public void onTextChanged(CharSequence charSequence, final int i, final 
    int i1, final int i2) { 
    Timer timer = new Timer(); 
    //Run after user stops typing 
    TimerTask tt = new TimerTask() { 
     @Override 
     public void run() { 
     Date myRunTime = new Date(); 
     if ((lastTypeTime.getTime() + 1000) <= myRunTime.getTime()) { 
      Handler h = new Handler(Looper.getMainLooper()); 
      h.post(new Runnable() { 
      @Override 
      public void run() { 
      Log.i("t_type", "Type Finish"); 
      //Issue : This is printed multiple time. 
      } 
     }); 
     } else { 
     Log.i("t_cancel", "cancel");//cancel 
     } 
    } 
    }; 
    timer.schedule(tt, 2000);//two second delay after user stops typing 
} 
+0

你怎么知道用户什么时候停止输入才能显示你的代码。 –

+0

这是因为你用timerTask尝试了不同的AlarmManager。使用http://www.vogella.com/tutorials/AndroidTaskScheduling/article.html –

+0

它每2秒运行 –

回答

1

我以这种方式解决问题。谢谢@jitesh mohite

@Override 
public void afterTextChanged(Editable editable) { 
    Log.i("t_text", editable.toString()); 
    if (!isTyping) { 
     isTyping = true; 
     Log.i("t_type", "Typing"); 
    } 
    timer.cancel(); 
    timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      android.os.Handler handler = new 

android.os.Handler(Looper.getMainLooper()); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        Log.i("t_type", "Type Finish"); 
        Toast.makeText(SearchActivity.this, "Type Finish", 

Toast.LENGTH_LONG).show(); 
        isTyping = false; 
       } 
      }); 
     } 
    }, 2000); 
} 
0

这就是我为我做的和为我工作的!

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 { 

     } 
    } 
    } 

);