2013-03-26 28 views
1

我想,以確保輸入的值是從0到100添加範圍檢查的EditText

所以我把我的過濾器:

myTextView.setFilters(new InputFilter[]{ new InputFilterMinMax(0,100) }); 

基於代碼是從一個教程的網站。

但是,它確實不是考慮到您可以在該字段中的任何位置鍵入。

阿卡我可以輸入90.9然後回去加1到前面使其190.9 ...它假定數量爲90.91

我以爲endstartdenddstart與確定新的字符串將看起來像什麼有關。

已經在此,可以幫助任何人,請經驗。

import android.text.InputFilter; 
import android.text.Spanned; 

public class InputFilterMinMax implements InputFilter { 

    private int min, max; 

    public InputFilterMinMax(int min, int max) { 
     this.min = min; 
     this.max = max; 
    } 

    public InputFilterMinMax(String min, String max) { 
     this.min = Integer.parseInt(min); 
     this.max = Integer.parseInt(max); 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
     try { 
      Double input = Double.parseDouble(dest.toString() + source.toString()); 
      if (isInRange(min, max, input)) 
       return null; 
     } catch (NumberFormatException nfe) { }  
     return ""; 
    } 

    private boolean isInRange(int a, int b, Double c) { 
     return b > a ? c >= a && c <= b : c >= b && c <= a; 
    } 
} 

回答

3

周圍的調試和最終值位打後,開始等

伊夫想出了這一點:

@Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
     try { 
      String newString = dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend); 

      Double input; 
      // If we only have one char and it is a minus sign, test against -1: 
      if (newString.length() == 1 && newString.charAt(0) == '-') 
       input = -1d; 
      else 
       input = Double.parseDouble(newString); 

      if (isInRange(min, max, input)) 
       return null; 
     } catch (NumberFormatException nfe) { }  
     return ""; 
    } 

此子字符串前面的和新的來源。刪除或在正確的位置添加文本,以生成會變成什麼(newString)的預覽。然後繼續檢查正常。

這適用於一次性刪除整個事情,或複製粘貼新的文本。它決定什麼舊短信來之前,文本插入,則其後面的文本。