2016-10-22 54 views
0

我有一個應用程序單個數字十進制EditText。我想在從1到120點之前過濾數字。我想讓用戶在點之後輸入一個數字。 例如:用戶可以輸入1,23,23,45.7,89.6,119.9,120.0等。 用戶不能輸入3.34,45.76,89.652,120.00,121.00等。 我該如何做到這一點?請給我寫濾波器EditText的工作對我而言)如何限制數字前後的數字點數EditText

回答

0

可以在TextWatcher

editText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable s) {} 

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

     @Override  
     public void onTextChanged(CharSequence s, int start, 

     } 
     }); 

更新的onTextChanged方法實現邏輯 對於開始的時候你可以使用這樣的事情:

editText.addTextChangedListener(new TextWatcher() { 

      boolean ignoreChange = false; 

      @Override 
      public void afterTextChanged(Editable s) {} 

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

      @Override 
      public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 

       if (!ignoreChange) { 
        String string = charSequence.toString(); 

        String[] parts = string.split("\\."); 
        if (parts.length > 1) { 
         String digitsAfterPoint = parts[1]; 
         if (digitsAfterPoint.length() > 1) { 
          ignoreChange = true; 
          editText.setText(string.substring(0, string.indexOf(".") + 2)); 
          editText.setSelection(editText.getText().length()); 
          ignoreChange = false; 
         } 
        } 
       } 

      } 

     }); 

但是你也應該控制「。」的重複項。符號或其他東西。

更新#2 對於值可以使用,例如,代碼:

 editText.addTextChangedListener(new TextWatcher() { 

      boolean ignoreChange = false; 
      String beforeChange; 

      @Override 
      public void afterTextChanged(Editable s) {} 

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

      @Override 
      public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 

       if (!ignoreChange) { 
        String string = charSequence.toString(); 

        String[] parts = string.split("\\."); 
        if (parts.length > 1) { 
         String digitsAfterPoint = parts[1]; 
         if (digitsAfterPoint.length() > 1) { 
          ignoreChange = true; 
          editText.setText(string.substring(0, string.indexOf(".") + 2)); 
          editText.setSelection(editText.getText().length()); 
          ignoreChange = false; 
         } 
        } 

        String strValue = editText.getText().toString(); 
        float value = Float.valueOf(strValue); 
        if (value < 1 || value > 120) { 
         ignoreChange = true; 
         editText.setText(beforeChange); 
         editText.setSelection(editText.getText().length()); 
         ignoreChange = false; 
        } 
        beforeChange = editText.getText().toString(); 
       } 

      } 

但你應該隨身攜帶正確的值輸入。並考慮每個數字NumberPickerSpinner

+0

你可以給我我需要的過濾器代碼。我是Android編程新手 –

+0

查看更新回答 –

+0

謝謝,但我如何使用代碼過濾小數點前的數字?附:看到我更新的問題:http://stackoverflow.com/questions/40210803/how-to-combine-input-fiters-for-numberdecimal-edittext –

1
mEditText.setFilters(new InputFilter[]{new DigitsInputFilter(maxDigitsBeforeDot, maxDigitsAfterDot, maxValue)}); 

如果不想點之前或之後,以限制數字只是把Integer.MAX_VALUE,以禁用最大值限制使用Double.POSITIVE_INFINITY

public class DigitsInputFilter implements InputFilter { 

    private final String DOT = "."; 

    private int mMaxIntegerDigitsLength; 
    private int mMaxDigitsAfterLength; 
    private double mMax; 


    public DigitsInputFilter(int maxDigitsBeforeDot, int maxDigitsAfterDot, double maxValue) { 
     mMaxIntegerDigitsLength = maxDigitsBeforeDot; 
     mMaxDigitsAfterLength = maxDigitsAfterDot; 
     mMax = maxValue; 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
     String allText = getAllText(source, dest, dstart); 
     String onlyDigitsText = getOnlyDigitsPart(allText); 

     if (allText.isEmpty()) { 
      return null; 
     } else { 
      double enteredValue; 
      try { 
       enteredValue = Double.parseDouble(onlyDigitsText); 
      } catch (NumberFormatException e) { 
       return ""; 
      } 
      return checkMaxValueRule(enteredValue, onlyDigitsText); 
     } 
    } 


    private CharSequence checkMaxValueRule(double enteredValue, String onlyDigitsText) { 
     if (enteredValue > mMax) { 
      return ""; 
     } else { 
      return handleInputRules(onlyDigitsText); 
     } 
    } 

    private CharSequence handleInputRules(String onlyDigitsText) { 
     if (isDecimalDigit(onlyDigitsText)) { 
      return checkRuleForDecimalDigits(onlyDigitsText); 
     } else { 
      return checkRuleForIntegerDigits(onlyDigitsText.length()); 
     } 
    } 

    private boolean isDecimalDigit(String onlyDigitsText) { 
     return onlyDigitsText.contains(DOT); 
    } 

    private CharSequence checkRuleForDecimalDigits(String onlyDigitsPart) { 
     String afterDotPart = onlyDigitsPart.substring(onlyDigitsPart.indexOf(DOT), onlyDigitsPart.length() - 1); 
     if (afterDotPart.length() > mMaxDigitsAfterLength) { 
      return ""; 
     } 
     return null; 
    } 

    private CharSequence checkRuleForIntegerDigits(int allTextLength) { 
     if (allTextLength > mMaxIntegerDigitsLength) { 
      return ""; 
     } 
     return null; 
    } 

    private String getOnlyDigitsPart(String text) { 
     return text.replaceAll("[^0-9?!\\.]", ""); 
    } 

    private String getAllText(CharSequence source, Spanned dest, int dstart) { 
     String allText = ""; 
     if (!dest.toString().isEmpty()) { 
      if (source.toString().isEmpty()) { 
       allText = deleteCharAtIndex(dest, dstart); 
      } else { 
       allText = new StringBuilder(dest).insert(dstart, source).toString(); 
      } 
     } 
     return allText; 
    } 

    private String deleteCharAtIndex(Spanned dest, int dstart) { 
     StringBuilder builder = new StringBuilder(dest); 
     builder.deleteCharAt(dstart); 
     return builder.toString(); 
    } 
} 
相關問題