2016-10-22 3 views
0

Ich habe eine App mit single numberdecimal EditText. Ich möchte Ziffern vor dem Punkt von 1 bis 120 filtern. Und ich möchte dem Benutzer erlauben, eine Ziffer nach dem anderen einzugeben. Beispiel: Der Benutzer kann Eingang 1, 2,3, 23, 45,7, 89,6, 119,9, 120,0 usw. Benutzer können nicht eingegeben 3,34, 45,76, 89,652, 120.00, 121.00 usw. Wie kann ich diese Filter tun? Bitte schreiben Sie mir, dass die Arbeit Filter mit EditText zu meinen Bedingungen)So begrenzen Sie die Ziffern vor und nach dem Punkt in der Zahl Dezimal EditText

Antwort

0

Sie können Ihre Logik in onTextChanged Methode von 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, 

     } 
     }); 

-Update implementieren Für Anfang Sie etwas wie folgt verwenden können:

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; 
         } 
        } 
       } 

      } 

     }); 

Aber Sie sollten auch Duplikate von "." Symbol oder etwas anderes.

Update # 2 Für Wert können Sie verwenden, zum Beispiel, dass Code:

 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(); 
       } 

      } 

Aber Sie sollten über korrekte Werte Eingabe tragen. Und denken Sie an NumberPicker oder Spinner für jede Ziffer.

+0

können Sie mir Code für Filter geben, die ich brauche. Ich bin neu in Android-Programmierung –

+0

Siehe aktualisierte Antwort –

+0

danke, aber wie kann ich Nummer vor dem Komma mit Ihrem Code filtern? P.S. Siehe meine aktualisierte Frage: http://stackoverflow.com/questions/40210803/how-to-combine-input-fiters-for-numberdecimal-edittext –

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

Wenn Sie wollen keine Stellen vor oder nach dem Punkt nur Integer.MAX_VALUE, disable auf Grenze MaximalwertDouble.POSITIVE_INFINITY Gebrauch genommen zu begrenzen.

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(); 
    } 
} 
Verwandte Themen