2012-10-19 69 views
3

我使用下面的InputFilter過濾掉無效(十進制值大於127的ASCII),並且EditText在輸入無效字符時顯示文本兩次。我希望EditText能夠顯示有效的字符,下面是發生什麼的例子。創建擴展的ASCII字符InputFilter

- 用戶進入XYZ€中的EditText組件的屏幕提示「無效的非ASCII字符」
-EditText組件顯示在屏幕上的xyz這是我所期待的
上出現
-toast消息 - 用戶輸入有效字符,因此屏幕顯示XYZA
-InputFilter運行並返回XYZAXYZXYZA出現在的EditText部件whic h不正確。它複製了XYZ

有關爲什麼在處理無效字符後複製輸入文本的任何想法?

屏幕:

<EditText android:id="@+id/editText" 
    android:layout_width="fill_parent" android:layout_height="120dp" 
    android:layout_marginTop="10dp" android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" android:maxLength="45" 
    android:focusable="true" android:inputType="text" 
    android:cursorVisible="true" android:imeOptions="actionDone" 
/> 

活動:

public class EditTextActivity extends Activity {   

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     EditText eText = (EditText) findViewById(R.id.editText); 
     setAsciiTextFilter(); 
    }  

    private void setAsciiTextFilter() { 

       InputFilter filter = new InputFilter() { 

        int asciiNo; 

        @Override 
        public CharSequence filter(CharSequence source, int start, int end, 
          Spanned dest, int dstart, int dend) { 

         for (int i = start; i < end; i++) { 

          asciiNo = source.charAt(i); 

          if(asciiNo > 127) {  

           toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT); 

           //Replace the invalid ascii character with empty String 
           return source.toString().replace(source.charAt(i)+"", ""); 
          }  
         } 
         return null; 
        } 
       }; 


      eText.setFilters(new InputFilter[]{filter}); 
    } 
} 

新嘗試:

InputFilter filter = new InputFilter() { 
         @Override 
         public CharSequence filter(CharSequence source, int start, int end, 
           Spanned dest, int dstart, int dend) { 

          if (source instanceof SpannableStringBuilder) { 
           SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source; 
           for (int i = end - 1; i >= start; i--) { 
            char currentChar = source.charAt(i); 
            int ascii = currentChar; 
            if (ascii > 127) {  
             sourceAsSpannableBuilder.delete(i, i+1); 
             toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT); 
            }  
           } 
           return source; 
          } else { 
           StringBuilder filteredStringBuilder = new StringBuilder(); 
           for (int i = 0; i < end; i++) { 
            char currentChar = source.charAt(i); 
            int ascii = currentChar; 
            if (ascii <= 127) {  
             filteredStringBuilder.append(currentChar); 
            }  
           } 
           return filteredStringBuilder.toString(); 
          } 
         } 
        }; 

回答

1

編輯:

我相信問題是你要返回整個字符串,當你只應該返回該字符的替換。 filter()只要文本更改就運行,並不一定代替EditText中的整個字符串。你需要注意這一點,所以你最終不會推出一個角色應該去的整個弦。

This question是相關的(只是將非ASCII字符替換爲非字母數字),並且答案已被很好接受,所以您應該可以使用它來獲得您想要的內容。

對不起,有關令人困惑的答案/刪除的事情。我在離開家之前就回答了。幾分鐘後,我意識到我的邏輯存在一個缺陷,所以我跳上了手機並將其刪除。我討厭試圖在我的手機上輸入完整的答案,所以只需稍等一下。

+1

感謝您的回答。我使用了你的建議並更新了我的代碼(在新的嘗試:部分)。由於sourceAsSpannableBuilder.delete(i,i + 1);一旦輸入了無效字符,即使有效字符,toast也會繼續顯示。每次都會不斷移除無效字符。儘管EditText不顯示它,但SourceAsSpannableBuilder似乎仍保留無效字符。只有在輸入無效字符時才顯示敬酒的任何方法?感謝所有幫助... – c12

+1

無視上面的問題,如果(結束==我+ 1){/ /顯示烤麪包}作品 – c12

1

我覺得最好使用單個for循環和答案。

另請注意,將源代碼傳遞給SpannableStringBuilder構造函數以便從源代碼複製跨度非常重要。如果你不這樣做,那麼事情就會變得詭異。

@Override 
    public CharSequence filter(CharSequence source, int start, 
      int end, Spanned dest, int dstart, int dend) { 
     SpannableStringBuilder ret; 

     if (source instanceof SpannableStringBuilder) { 
      ret = (SpannableStringBuilder)source; 
     } else { 
      ret = new SpannableStringBuilder(source); 
     } 

     for (int i = end - 1; i >= start; i--) { 
      char currentChar = source.charAt(i); 
      char currentChar = source.charAt(i); 
      int ascii = currentChar; 
      if (ascii > 127) {  
       ret.delete(i, i+1); 
       toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT); 
      }  
     } 

     return ret; 
    }