2016-07-25 8 views
0

Ich möchte einen Text bearbeiten, der nur dem Benutzer erlaubt, eine bestimmte Anzahl von Text eingeben, für meinen Fall möchte ich 16 Ziffern, und dann gruppieren sie in Paaren von 4. Ich habe das Textlimit bereits festgelegt. Momentan sieht mein Code so aus:Edit Text, der nur eine bestimmte Anzahl von Ziffern erlaubt, und gruppiert sie in Paaren von vier Android

<android.support.design.widget.TextInputLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:counterEnabled="true" 
    app:counterMaxLength="16"> 

    <EditText 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="Enter Code" 
     android:inputType="number" /> 
</android.support.design.widget.TextInputLayout> 

Aber jetzt ist meine Frage, wie man sie gruppiert. Ich möchte, dass meine endgültige Ausgabe in etwa so aussieht. XXXX-XXXX-XXXX-XXXX-. So wie ein Produktschlüssel aussieht.

+0

Check diese gleiche Lösung http://stackoverflow.com/questions/5947674/custom-format-edit-text- Eingabe-android-zu-akzeptieren-Kreditkartennummer –

Antwort

0

Sie haben zwei Möglichkeiten:

  1. eine TextWatcher zum EditText hinzufügen. Bewerten Sie nach jeder Zeichenzugabe den Inhalt und fügen Sie die Striche nach Bedarf hinzu. Dies ist die schnellere Lösung.

  2. Werfen Sie einen Blick auf EditTextsourcecode (auf der API-Ebene depensing, es in der sourcecode der Superklasse von EditText sein kann auch, Textview). Studieren Sie seine onDraw() Metchod und implementieren Sie dann Ihre eigene Klasse, die EditText erweitert, die den Text zeichnen wird, wie Sie es wollen. Dies wird mehr Zeit in Anspruch nehmen, aber die Methode getText() gibt die unverarbeitete Eingabe ohne Bindestriche zurück.

2

Sie mit dem Code unten versuchen können, es funktioniert gut:

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = "my_log"; 
    static final Pattern CODE_PATTERN = Pattern.compile("([0-9]{0,4})|([0-9]{4}-)+|([0-9]{4}-[0-9]{0,4})+"); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final EditText editText = (EditText) findViewById(R.id.editText); 
     editText.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable s) { 
       Log.d(TAG, "input" + s.toString()); 

       if (s.length() > 0 && !CODE_PATTERN.matcher(s).matches()) { 
        String input = s.toString(); 
        String numbersOnly = keepNumbersOnly(input); 
        String code = formatNumbersAsCode(numbersOnly); 

        Log.d(TAG, "numbersOnly" + numbersOnly); 
        Log.d(TAG, "code" + code); 

        editText.removeTextChangedListener(this); 
        editText.setText(code); 
        editText.setSelection(code.length()); 
        editText.addTextChangedListener(this); 
       } 
      } 

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

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

      private String keepNumbersOnly(CharSequence s) { 
       return s.toString().replaceAll("[^0-9]", ""); 
      } 

      private String formatNumbersAsCode(CharSequence s) { 
       int groupDigits = 0; 
       String tmp = ""; 
       for (int i = 0; i < s.length(); ++i) { 
        tmp += s.charAt(i); 
        ++groupDigits; 
        if (groupDigits == 4) { 
         tmp += "-"; 
         groupDigits = 0; 
        } 
       } 
       return tmp; 
      } 
     }); 
    } 

}