机器人格式的EditText到每4个字符之后显示空间(android format edittext

2019-06-23 19:40发布

Android的 - 我想从用户到一个EditText输入的号码 - 它需要用空格隔开 - 每4个字符。 例如:123456781234 - > 1234 5678 1234

这仅仅是视觉的目的。 但是我必须在不进一步使用空间的字符串。

什么是我能做到这一点的最简单的方法?

Answer 1:

您需要使用TextWatcher达到视觉上的目的的空间。

和使用任何简单地拆分串通过空间的逻辑来明智加入回或循环通过每个字符整个字符串并消除(char) 32从字符串



Answer 2:

这是editext信用卡?
首先创建计数变量

int count = 0;

那么把它放进你的OnCreate(活动)/ onviewcreated(片段)

    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) {
            if (count <= ccEditText.getText().toString().length()
                    &&(ccEditText.getText().toString().length()==4
                    ||ccEditText.getText().toString().length()==9
                        ||ccEditText.getText().toString().length()==14)){
                ccEditText.setText(ccEditText.getText().toString()+" ");
                int pos = ccEditText.getText().length();
                ccEditText.setSelection(pos);
            }else if (count >= ccEditText.getText().toString().length()
                    &&(ccEditText.getText().toString().length()==4
                    ||ccEditText.getText().toString().length()==9
                    ||ccEditText.getText().toString().length()==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();
        }
    });


Answer 3:

作为@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());

每当你需要得到的字符串没有空格这样做:

String str = yourTxtView.getText().toString().replace(" ", "");


Answer 4:

文本格式是000 000 0000

像XXX-XXX-XX-XX机器人的EditText textwatcher格式的电话号码

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

}
}


Answer 5:

这里是一个小的帮助作用。 为了您的例子中,你会调用它与

addPadding(" ", "123456781234", 4);

/**
 * @brief Insert arbitrary string at regular interval into another string 
 * 
 * @param t String to insert every 'num' characters
 * @param s String to format
 * @param num Group size
 * @return
 */
private String addPadding(String t, String s, int num) {
    StringBuilder retVal;

    if (null == s || 0 >= num) {
        throw new IllegalArgumentException("Don't be silly");
    }

    if (s.length() <= num) {
        //String to small, do nothing
        return s;
    }

    retVal = new StringBuilder(s);

    for(int i = retVal.length(); i > 0; i -= num){
        retVal.insert(i, t);
    }
    return retVal.toString();
}


Answer 6:

改变文字直播,同时打字有些什么困难。 我们应该处理好以下几个问题。

一个。 光标位置b。 我们应该允许用户删除输入的文本。

下面的代码同时处理的问题。

  1. 添加TextWatcher到EditText上,并从“afterTextchanged()”的文字,写你的逻辑

    字符串str = “”; INT strOldlen = 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); } } } 
  2. 在这里,我想对每四个字符添加空间。 加入第一空间后,则该文本的长度是5,以便下一个空间是后9个字符那样。

    如果(strlen的== 4 || STRLEN == 9)

    1. 这里的另一个问题是光标位置,一旦你修改的EditText的文本,将光标移动到第一的位置。 所以我们需要手动设置光标。

    edtAadharNumber.setSelection(edtAadharNumber.getText()长度());

    1. 我的文字长度仅为12个字符。 所以我做的手工计算,如果你的文字是动态的,那么你就写动态逻辑。


Answer 7:

简单的答案

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


        }
    });


Answer 8:

@ ARIO的回答更清洁的版本,遵循DRY原则:

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


Answer 9:

假设你知道字符串的最终长度,你可以实现一个TextWatcher是这样的:

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?) {
        }
    })

你只需要添加一个空格每4位数块。 p2 == 0是保证用户不删除,否则他/她将获得的股票。

该代码是在科特林,你可以做到这一点正是Java中的相同。



文章来源: android format edittext to display spaces after every 4 characters