Android 编辑只允许给定位数的文本,并将它们分成四对
我想要一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要16位数字,然后将它们分组成4对。我已经设置了文本限制。目前我的代码是这样的Android 编辑只允许给定位数的文本,并将它们分成四对,android,android-edittext,Android,Android Edittext,我想要一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要16位数字,然后将它们分组成4对。我已经设置了文本限制。目前我的代码是这样的 <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:counterEnabled="true" app:counter
<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-。产品密钥的外观类型。您有两种选择:
TextWatcher
添加到EditText
中。然后在每个字符添加后,评估内容并根据需要添加破折号这是更快的解决方案。EditText
(根据API级别的不同,它也可能位于EditText
,Textview
的超类中)。研究它的onDraw()
metchod,然后实现自己的类扩展EditText
,它将根据需要绘制文本这将花费更多时间,但是getText()
方法将返回原始输入,不带破折号。TextWatcher
添加到EditText
中。然后在每个字符添加后,评估内容并根据需要添加破折号这是更快的解决方案。EditText
(根据API级别的不同,它也可能位于EditText
,Textview
的超类中)。研究它的onDraw()
metchod,然后实现自己的类扩展EditText
,它将根据需要绘制文本这将花费更多时间,但是getText()
方法将返回原始输入,不带破折号。您可以使用下面的代码进行尝试,效果很好:
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;
}
});
}
}
public类MainActivity扩展了AppCompatActivity{
私有静态最终字符串标记=“我的日志”;
静态最终模式代码_Pattern=Pattern.compile(([0-9]{0,4})|([0-9]{4}-+)+|([0-9]{4}-[0-9]{0,4}+);
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText EditText=(EditText)findViewById(R.id.EditText);
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
公共无效后文本已更改(可编辑){
Log.d(标记“input”+s.toString());
if(s.length()>0&!CODE_PATTERN.matcher.matches()){
字符串输入=s.toString();
字符串numbersOnly=仅保留数字(输入);
字符串代码=FormatNumberScode(仅限数字);
Log.d(标签“numbersOnly”+numbersOnly);
日志d(标签,“代码”+代码);
removeTextChangedListener(此);
editText.setText(代码);
editText.setSelection(code.length());
editText.addTextChangedListener(此);
}
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
私有字符串keepnsonly(字符序列){
返回s.toString().replaceAll([^0-9],”);
}
专用字符串格式NumberScode(字符序列){
int-groupDigits=0;
字符串tmp=“”;
对于(int i=0;i
您可以尝试使用下面的代码,它运行良好:
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;
}
});
}
}
public类MainActivity扩展了AppCompatActivity{
私有静态最终字符串标记=“我的日志”;
静态最终模式代码_Pattern=Pattern.compile(([0-9]{0,4})|([0-9]{4}-+)+|([0-9]{4}-[0-9]{0,4}+);
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText EditText=(EditText)findViewById(R.id.EditText);
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
公共无效后文本已更改(可编辑){
Log.d(标记“input”+s.toString());
if(s.length()>0&!CODE_PATTERN.matcher.matches()){
字符串输入=s.toString();
字符串numbersOnly=仅保留数字(输入);
字符串代码=FormatNumberScode(仅限数字);
Log.d(标签“numbersOnly”+numbersOnly);
日志d(标签,“代码”+代码);
removeTextChangedListener(此);
editText.setText(代码);
editText.setSelection(code.length());
editText.addTextChangedListener(此);
}
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
私有字符串keepnsonly(字符序列){
返回s.toString().replaceAll([^0-9],”);
}
专用字符串格式NumberScode(字符序列){
int-groupDigits=0;
字符串tmp=“”;
对于(int i=0;i