2

我試圖在文本發生更改後的一定時間後調用函數。我有延遲設置,但由於某種原因,我的功能被調用兩次。這裏是我的代碼:在文本發生更改後的Android調用函數片段

public class ExampleFragment extends Fragment { 


private EditText mText; 
private Handler mHandler; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    mHandler = new Handler(); 

    View rootView = inflater.inflate(R.layout.fragment_start_process, container, false);  

    mText = (EditText) rootView.findViewById(R.id.editText1); 

    mText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(final Editable s) { 

      // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)  

      System.out.println("TEXT CHANGE" + s);    

      final Runnable r = new Runnable() { 

       @Override 
       public void run() { 
        final Editable x = s; 
        System.out.println("DELAY TEXT " + xEditable);      
       } 
      };    
      mHandler.postDelayed(r, 1000); 
     } 
    });   

    return rootView; 
} 

我System.out.println語句是這樣的:

文本更改^ h

文本更改嗨

延遲文本嗨

延遲文本嗨

所以它看起來像當我把我的功能變成可運行,它會運行兩次。我只希望它運行一次(延遲文本應該只顯示一次)。任何想法我做錯了什麼?我的整個目標是在文字發生變化之後等待一段時間(以確保文本完全上傳),然後運行一次我的功能。我讀過AsyncTask可以使用,但我不熟悉這一點。任何幫助將不勝感激。

回答

0

您的Runnable執行兩次,因爲afterTextChanged()在每個鍵入的字符後被調用。

如果你想在用戶開始輸入後1秒鐘後執行一些代碼,你可以給runnable添加一個標誌,使其只運行一次。

private boolean mFlag = true; 


@Override 
public void afterTextChanged(final Editable s) { 

    // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)  

    Log.w(TAG, "TEXT CHANGE " + s); 

    final Runnable mRunnable = new Runnable() { 
     @Override 
     public void run(){ 
      final Editable x = s; 
      Log.w(TAG, "DELAY TEXT " + x.toString()); 
     } 
    } 

    if(mFlag){ 
     mHandler.postDelayed(r, 1000);  
     mFlag = false; 
    } 

} 
+0

謝謝你的幫助。 – user3781214