2016-07-25 15 views
0

私は16桁の数字を入力するために、 これらのペアを4にグループ化します。私はすでにテキストの制限を設定しています。現在のところ、私のコードは次のようになります。特定の桁数のみを許可するテキストを編集し、4つのグループにグループ化します。

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

しかし、今私の質問はどのようにグループ化するかです。私の最終的な出力は、XXXX-XXXX-XXXX-XXXX-のようになります。プロダクトキーがどのように見えるかを指定します。

+0

はこの同じ溶液http://stackoverflow.com/questions/5947674/custom-format-edit-text-をチェック入力アンドロイドで受け入れ可能なクレジットカード番号 –

答えて

0

あなたは2つのオプションがあります。

  1. EditTextTextWatcherを追加します。その後、すべての文字を追加した後、内容を評価し、必要に応じてダッシュを追加します。 これはより迅速な解決策です。

  2. EditTextsourcecodeを見てください(APIレベルでdepensing、それはまた、EditTextのスーパークラスのsourcecodeTextviewであってもよいです)。そのonDraw()のmetchodを調べて、EditTextを拡張して独自のクラスを実装します。これにより、必要に応じてテキストが描画されます。 これにはさらに時間がかかりますが、getText()メソッドは、生の入力をダッシュ​​なしで返します。

2

あなたはそれがうまく機能し、以下のコードを試すことができます。

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

} 
関連する問題