2013-02-08 34 views
4

後不正確的字符串我使用的是TextWatcher聽鍵輸入。當用戶鍵入'@'時,我打開一個列表活動,用戶必須從列表中選擇。一旦選擇,我將所選項目的文本(包括初始@)放到編輯文本中,然後進行正常編輯。TextWatcher.afterTextChanged有退格

的問題是,當我按空格鍵,我在aftertextchanged事件而得到的字符串是錯誤的,listactivity再次彈出。

editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 

     } 

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

     } 

     @Override 
     public void afterTextChanged(Editable s) 
     { 
      String str = s.toString(); 

      if (str.length() > 0) 
      { 
       if (str.substring(str.length() - 1).equals("@")) 
       { 
        Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class); 
        startActivityForResult(i, Util.MEMBERS_LIST); 
       } 
      } 
     } 
    }); 

而且在onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == Util.MEMBERS_LIST) 
     if (resultCode == RESULT_OK) 
     { 
      editText.setText(editText.getText().toString() + data.getExtras().get("screenname") + " "); 
      editText.setSelection(editText.getText().length()); 
     } 
} 

例如:

在我的EditText型 '@',活動彈出,我選擇 '詹姆斯'。 EditText現在顯示@James。 如果我按回退一次或兩次,EditText顯示@Jam時,再次彈出listactivity。

PS:本afterTextChanged()被調用有時兩次退格(或任意鍵),在afterTextChanged的第二次執行()我得到錯誤的輸入字符串。在afterTextChanged()的第一次執行時,我得到了@Jam,在第二次執行時我得到了'@',因此彈出了listactivity。

問: 爲什麼afterTextChanged()被調用了兩次,爲什麼在第二次執行我得到錯誤的文字?

非常感謝。

+0

請不要「乞求bug」。很有可能它不是圖書館裏的一個錯誤......清楚地說明問題和問題,看看它是什麼。 – 2013-02-08 05:49:03

+0

任何可能的解決方案? – droidbee

+0

我看到類似的東西,很想找到答案... – joseph

回答

1

我有完全相同的問題。我不知道是什麼原因造成額外的假回調長度爲0的Editable/CharacterSequence。

我一直在尋找,實際上造成了一個空的EditText上一個EditText變化。我最終不得不實施一個處理程序來檢查500毫秒後的EditText長度。您可能需要將您的edittext設爲靜態或最終。它應該看起來像這樣:

 final Handler handler =new Handler(); 
    final Runnable r = new Runnable(){ 

     @Override 
     public void run() 
     { 
      // 

      String str = editText.getText().toString(); 

      if (str.length() > 0) 
      { 
       if (str.substring(str.length() - 1).equals("@")) 
       { 
        Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class); 
        startActivityForResult(i, Util.MEMBERS_LIST); 
       } 
      } 
     } 
    } ; 



    editText.addTextChangedListener(new TextWatcher() 
    { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) 
     { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) 
     { 

     } 

     @Override 
     public void afterTextChanged(Editable s) 
     { 

      handler.postDelayed(r,500); 

     } 
    });