编辑仅允许给定数量的数字的文本,并将它们分成四个Android对

时间:2016-07-25 07:28:48

标签: android android-edittext

我希望有一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要16个数字,然后将它们分组成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 - 。有点像产品密钥的样子。

2 个答案:

答案 0 :(得分: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;
            }
        });
    }

}

答案 1 :(得分:0)

您有两种选择:

  1. TextWatcher添加EditText。然后在每个字符添加后,评估内容并根据需要添加短划线。 这是更快的解决方案。

  2. 查看EditText sourcecode(根据API级别,它也可能位于超级EditText的{​​{3}}中,{ {1}})。研究它的Textview metchod,然后实现你自己的扩展onDraw()的类,它将根据你的需要绘制文本。 这将花费更多时间,但EditText方法将返回原始输入,不带破折号。