我希望有一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要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 - 。有点像产品密钥的样子。
答案 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)
您有两种选择:
向TextWatcher
添加EditText
。然后在每个字符添加后,评估内容并根据需要添加短划线。 这是更快的解决方案。
查看EditText
sourcecode(根据API级别,它也可能位于超级EditText
的{{3}}中,{ {1}})。研究它的Textview
metchod,然后实现你自己的扩展onDraw()
的类,它将根据你的需要绘制文本。 这将花费更多时间,但EditText
方法将返回原始输入,不带破折号。