android格式编辑文本,每4个字符后显示空格
Android-我想从用户那里得到一个数字输入到EditText中-它需要用空格分隔-每4个字符。 示例:123456781234->1234 5678 1234 这仅用于视觉目的。但是,我需要不带空格的字符串以供进一步使用 我能做到这一点的最简单方法是什么?您需要使用它来实现视觉目的空间android格式编辑文本,每4个字符后显示空格,android,android-edittext,Android,Android Edittext,Android-我想从用户那里得到一个数字输入到EditText中-它需要用空格分隔-每4个字符。 示例:123456781234->1234 5678 1234 这仅用于视觉目的。但是,我需要不带空格的字符串以供进一步使用 我能做到这一点的最简单方法是什么?您需要使用它来实现视觉目的空间 并使用任何简单的按空格分割的字符串逻辑将其按字符顺序连接或循环整个字符串,并从字符串中删除(char)32,,正如@waqas指出的,如果您的目标是在用户键入数字时实现这一点,则需要使用TextWatcher
并使用任何简单的按空格分割的字符串逻辑将其按字符顺序连接或循环整个字符串,并从字符串中删除
(char)32
,,正如@waqas指出的,如果您的目标是在用户键入数字时实现这一点,则需要使用TextWatcher。以下是一种实现空间的潜在方法:
StringBuilder s;
s = new StringBuilder(yourTxtView.getText().toString());
for(int i = 4; i < s.length(); i += 5){
s.insert(i, " ");
}
yourTxtView.setText(s.toString());
这里有一个小的帮助功能。举个例子,你可以用
addPadding(“,”123456781234“,4)代码>
/**
*@brief以固定间隔将任意字符串插入另一个字符串
*
*@param t字符串以插入每个“num”字符
*@param要格式化的字符串
*@param num组大小
*@返回
*/
私有字符串addPadding(字符串t、字符串s、int num){
StringBuilder retVal;
if(null==s | | 0>=num){
抛出新的非法辩论例外(“别傻了”);
}
如果(s.length()0;i-=num){
返回。插入(i,t);
}
返回retVal.toString();
}
这是信用卡的编辑文本吗?
首先创建计数变量
int count = 0;
然后将其放在oncreate(活动)/onviewcreated(片段)中
ccEditText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(字符序列、整数开始、,
int count,int after){/*空*/}
@凌驾
public void onTextChanged(字符序列,int start,int before,
整数计数){/*空*/}
@凌驾
公共无效后文本已更改(可编辑){
int inputlength=ccEditText.getText().toString().length();
如果(计数=inputlength&&(inputlength==4||
inputlength==9 | | inputlength==14)){
ccEditText.setText(ccEditText.getText().toString())
.substring(0,ccEditText.getText()
.toString().length()-1));
int pos=ccEditText.getText().length();
ccEditText.setSelection(pos);
}
count=ccEditText.getText().toString().length();
}
});
在打字时更改实时文本有些困难。我们应该处理以下问题
a。光标位置
B我们应该允许用户删除输入的文本
下面的代码处理这两个问题
将TextWatcher添加到EditText,并从“afterTextchanged()”获取文本并编写逻辑
字符串str=“”;
int-strolden=0
@Override
public void afterTextChanged(Editable s) {
str = edtAadharNumber.getText().toString();
int strLen = str.length();
if(strOldlen<strLen) {
if (strLen > 0) {
if (strLen == 4 || strLen == 9) {
str=str+" ";
edtAadharNumber.setText(str);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}else{
if(strLen==5){
if(!str.contains(" ")){
String tempStr=str.substring(0,strLen-1);
tempStr +=" "+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
if(strLen==10){
if(str.lastIndexOf(" ")!=9){
String tempStr=str.substring(0,strLen-1);
tempStr +=" "+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
strOldlen = strLen;
}
}else{
return;
}
}else{
strOldlen = strLen;
Log.i("MainActivity ","keyDel is Pressed ::: strLen : "+strLen+"\n old Str Len : "+strOldlen);
}
}
}
@覆盖
公共无效后文本已更改(可编辑){
str=edtAadharNumber.getText().toString();
int strLen=str.length();
if(strolden 0){
如果(strLen==4 | | strLen==9){
str=str+“”;
edtAadharNumber.setText(str);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}否则{
如果(strLen==5){
如果(!str.contains(“”){
字符串tempStr=str.substring(0,strLen-1);
tempStr+=“”+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
如果(strLen==10){
如果(str.lastIndexOf(“”)=9){
字符串tempStr=str.substring(0,strLen-1);
tempStr+=“”+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
strolden=strLen;
}
}否则{
返回;
}
}否则{
strolden=strLen;
Log.i(“MainActivity”,“按下keyDel:::strLen:“+strLen+”\n旧strLen:“+strollen”);
}
}
}
在这里,我试图为每四个字符添加空间。添加第一个空格后,文本长度为5。所以下一个空格在9个字符之后
如果(strLen==4 | | strLen==9)
这里的另一个问题是光标位置,一旦修改edittext的文本,光标将移动到第一位。所以我们需要手动设置光标
edtAadharNumber.setSelection(edtAadharNumber.getText().length())
我的文本长度只有12个字符。所以我在做手工计算,如果你的文本是动态的,那么你就写动态逻辑
文本格式为0000000
公共类PhoneNumberTextWatcher实现TextWatcher{
私有静态最终字符串标记=PhoneNumberTextWatcher.class
.getSimpleName();
私人编辑文本;
私有布尔isDelete;
公用电话号码ExtWatcher(EditText-edTxtPhone){
this.edTxt=edTxtPhone;
setOnKeyListener(新视图.OnKeyListener(){
@凌驾
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
if(keyCode==KeyEvent.keyCode_DEL){
isDelete=真;
}
返回false;
}
});
}
公共void onTextChanged(字符)
int count = 0;
ccEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) { /*Empty*/}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) { /*Empty*/ }
@Override
public void afterTextChanged(Editable s) {
int inputlength = ccEditText.getText().toString().length();
if (count <= inputlength && inputlength == 4 ||
inputlength == 9 || inputlength == 14)){
ccEditText.setText(ccEditText.getText().toString() + " ");
int pos = ccEditText.getText().length();
ccEditText.setSelection(pos);
} else if (count >= inputlength && (inputlength == 4 ||
inputlength == 9 || inputlength == 14)) {
ccEditText.setText(ccEditText.getText().toString()
.substring(0, ccEditText.getText()
.toString().length() - 1));
int pos = ccEditText.getText().length();
ccEditText.setSelection(pos);
}
count = ccEditText.getText().toString().length();
}
});
@Override
public void afterTextChanged(Editable s) {
str = edtAadharNumber.getText().toString();
int strLen = str.length();
if(strOldlen<strLen) {
if (strLen > 0) {
if (strLen == 4 || strLen == 9) {
str=str+" ";
edtAadharNumber.setText(str);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}else{
if(strLen==5){
if(!str.contains(" ")){
String tempStr=str.substring(0,strLen-1);
tempStr +=" "+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
if(strLen==10){
if(str.lastIndexOf(" ")!=9){
String tempStr=str.substring(0,strLen-1);
tempStr +=" "+str.substring(strLen-1,strLen);
edtAadharNumber.setText(tempStr);
edtAadharNumber.setSelection(edtAadharNumber.getText().length());
}
}
strOldlen = strLen;
}
}else{
return;
}
}else{
strOldlen = strLen;
Log.i("MainActivity ","keyDel is Pressed ::: strLen : "+strLen+"\n old Str Len : "+strOldlen);
}
}
}
public class PhoneNumberTextWatcher implements TextWatcher {
private static final String TAG = PhoneNumberTextWatcher.class
.getSimpleName();
private EditText edTxt;
private boolean isDelete;
public PhoneNumberTextWatcher(EditText edTxtPhone) {
this.edTxt = edTxtPhone;
edTxt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
isDelete = true;
}
return false;
}
});
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
if (isDelete) {
isDelete = false;
return;
}
String val = s.toString();
String a = "";
String b = "";
String c = "";
if (val != null && val.length() > 0) {
val = val.replace(" ", "");
if (val.length() >= 3) {
a = val.substring(0, 3);
} else if (val.length() < 3) {
a = val.substring(0, val.length());
}
if (val.length() >= 6) {
b = val.substring(3, 6);
c = val.substring(6, val.length());
} else if (val.length() > 3 && val.length() < 6) {
b = val.substring(3, val.length());
}
StringBuffer stringBuffer = new StringBuffer();
if (a != null && a.length() > 0) {
stringBuffer.append(a);
if (a.length() == 3) {
stringBuffer.append(" ");
}
}
if (b != null && b.length() > 0) {
stringBuffer.append(b);
if (b.length() == 3) {
stringBuffer.append(" ");
}
}
if (c != null && c.length() > 0) {
stringBuffer.append(c);
}
edTxt.removeTextChangedListener(this);
edTxt.setText(stringBuffer.toString());
edTxt.setSelection(edTxt.getText().toString().length());
edTxt.addTextChangedListener(this);
} else {
edTxt.removeTextChangedListener(this);
edTxt.setText("");
edTxt.addTextChangedListener(this);
}
}
}
private int prevCount = 0;
private boolean isAtSpaceDelimiter(int currCount) {
return currCount == 4 || currCount == 9 || currCount == 14;
}
private boolean shouldIncrementOrDecrement(int currCount, boolean shouldIncrement) {
if (shouldIncrement) {
return prevCount <= currCount && isAtSpaceDelimiter(currCount);
} else {
return prevCount > currCount && isAtSpaceDelimiter(currCount);
}
}
private void appendOrStrip(String field, boolean shouldAppend) {
StringBuilder sb = new StringBuilder(field);
if (shouldAppend) {
sb.append(" ");
} else {
sb.setLength(sb.length() - 1);
}
cardNumber.setText(sb.toString());
cardNumber.setSelection(sb.length());
}
ccEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String field = editable.toString();
int currCount = field.length();
if (shouldIncrementOrDecrement(currCount, true)){
appendOrStrip(field, true);
} else if (shouldIncrementOrDecrement(currCount, false)) {
appendOrStrip(field, false);
}
prevCount = cardNumber.getText().toString().length();
}
});
override fun setUp(view: View?) {
editText.addTextChangedListener(object : TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) {
if(p2 == 0 && (p0.length == 4 || p0.length == 9 || p0.length == 14))
editText.append(" ")
}
override fun afterTextChanged(p0: Editable?) {
}
})
YourEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int len=s.toString().length();
if (before == 0 && (len == 4 || len == 9 || len == 14 ))
YourEditText.append(" ");
}
@Override
public void afterTextChanged(Editable s) {
}
});
/**
* Custom [TextWatcher] class that appends a given [separator] for every [interval].
*/
abstract class SeparatorTextWatcher(
private val separator: Char,
private val interval: Int
) : TextWatcher {
private var dirty = false
private var isDelete = false
override fun afterTextChanged(editable: Editable?) {
if (dirty) return
dirty = true
val text = editable.toString().handleSeparator()
onAfterTextChanged(text)
dirty = false
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
// Empty
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
isDelete = before != 0
}
private fun String.handleSeparator(): String {
val stringBuilder = StringBuilder(this)
if (length > 0 && length.rem(interval + 1) == 0) {
if (isDelete) {
stringBuilder.deleteCharAt(length - 1)
} else {
stringBuilder.insert(length - 1, separator)
}
}
return stringBuilder.toString()
}
/**
* Subclasses must implement this method to get the formatted text.
*/
abstract fun onAfterTextChanged(text: String)
}
editText.addTextChangedListener(object : SeparatorTextWatcher(' ', 4) {
override fun onAfterTextChanged(text: String) {
editText.run {
setText(text)
setSelection(text.length)
}
}
})
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final FormatEditText editText1 = findViewById(R.id.edit_text_1);
editText1.setFormat("---- ---- ---- ----");
}
}
yourEditText.addTextChangedListener(object : TextWatcher {
private val TOTAL_SYMBOLS = 19 // size of pattern 0000-0000-0000-0000
private val TOTAL_DIGITS = 16 // max numbers of digits in pattern: 0000 x 4
private val DIVIDER_MODULO =
5 // means divider position is every 5th symbol beginning with 1
private val DIVIDER_POSITION =
DIVIDER_MODULO - 1 // means divider position is every 4th symbol beginning with 0
private val DIVIDER = ' '
override fun beforeTextChanged(
s: CharSequence,
start: Int,
count: Int,
after: Int
) { // noop
}
override fun onTextChanged(
s: CharSequence,
start: Int,
before: Int,
count: Int
) { // noop
}
override fun afterTextChanged(s: Editable) {
if (!isInputCorrect(s, TOTAL_SYMBOLS, DIVIDER_MODULO, DIVIDER)) {
var repl = buildCorrectString(
getDigitArray(s, TOTAL_DIGITS),
DIVIDER_POSITION,
DIVIDER
)
yourEditText.clearFocus();
yourEditText.setText(repl);
yourEditText.requestFocus();
yourEditText.setSelection(repl!!.length);
}
}
private fun isInputCorrect(
s: Editable,
totalSymbols: Int,
dividerModulo: Int,
divider: Char
): Boolean {
var isCorrect =
s.length <= totalSymbols // check size of entered string
for (i in 0 until s.length) { // check that every element is right
isCorrect = if (i > 0 && (i + 1) % dividerModulo == 0) {
isCorrect and (divider == s[i])
} else {
isCorrect and Character.isDigit(s[i])
}
}
return isCorrect
}
private fun buildCorrectString(
digits: CharArray,
dividerPosition: Int,
divider: Char
): String? {
val formatted = StringBuilder()
for (i in digits.indices) {
if (digits[i] != '\u0000') {
formatted.append(digits[i])
if (i > 0 && i < digits.size - 1 && (i + 1) % dividerPosition == 0) {
formatted.append(divider)
}
}
}
return formatted.toString()
}
private fun getDigitArray(s: Editable, size: Int): CharArray {
val digits = CharArray(size)
var index = 0
var i = 0
while (i < s.length && index < size) {
val current = s[i]
if (Character.isDigit(current)) {
digits[index] = current
index++
}
i++
}
return digits
}
})
}
android:afterTextChanged="@{handler::afterTextChanged}"
fun afterTextChanged(s: Editable) {
if (s.length > 0 && s.length % 5 === 0) {
val c: Char = s.get(s.length - 1)
if (space === c) {
s.delete(s.length - 1, s.length)
}
}
// Insert char where needed.
if (s.length > 0 && s.length % 5 === 0) {
val c: Char = s.get(s.length - 1)
// Only if its a digit where there should be a space we insert a space
if (Character.isDigit(c) && TextUtils.split(
s.toString(),
space.toString()
).size <= 3
) {
s.insert(s.length - 1, space.toString())
}
}
}
private val space: Char = ' '
editText.doAfterTextChanged { text ->
val formattedText = text.toString().replace(" ", "").chunked(4).joinToString(" ")
if (formattedText != text.toString()) {
editText.setText(formattedText)
}
}
editText.text.toString().replace(" ","")