19

Android-ユーザーからEditTextに数値を入力したい-4文字ごとにスペースで区切る必要があります。例:123456781234-> 1234 5678 1234

これは視覚的な目的のためだけです。ただし、さらに使用するには、スペースのない文字列が必要です。

これを行う最も簡単な方法は何ですか?

4

14 に答える 14

14

このeditextはクレジットカード用ですか?
最初にカウント変数を作成します

int count = 0;

次に、これをoncreate(activity)/ onviewcreated(fragment)に入れます

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();
    }
});
于 2016-05-01T16:17:15.677 に答える
12

@waqasが指摘したように、ユーザーが番号を入力したときにこれを実現することが目的の場合は、TextWatcherを使用する必要があります。スペースを実現するための1つの潜在的な方法は次のとおりです。

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(" ", "");
于 2012-04-20T20:09:10.367 に答える
8

これを達成するためのより簡単な方法があります:

editText.doAfterTextChanged { text ->
    val formattedText = text.toString().replace(" ", "").chunked(4).joinToString(" ")
    if (formattedText != text.toString()) {
        editText.setText(formattedText)
    }
}

スペースなしでテキストを取得したい場合は、次のようにします。

editText.text.toString().replace(" ","")
于 2021-03-29T14:31:57.457 に答える
4

視覚的な目的のスペースを実現するには、 TextWatcherを使用する必要があります。

そして、スペースロジックで単純に分割された文字列を使用して、文字列を結合するか、文字ごとに文字列全体をループして、文字(char) 32列から削除します

于 2012-04-20T20:01:23.483 に答える
3

与えられた振る舞いをカプセル化するクラスを作成しました。

/**
 * 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)
                }
            }
        })
于 2019-09-13T16:33:59.603 に答える
1

テキストの形式は000000000000です

xxx-xxx-xx-xxのようなandroidedittexttextwatcher形式の電話番号

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

}
}
于 2017-07-13T09:21:14.963 に答える
1

DRYの原則に従った@Arioの回答のよりクリーンなバージョン:

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(); 
    } 
}); 
于 2017-08-22T23:36:46.523 に答える
1

私はこれをたくさん検索しましたここにカードのkotlinの完全なコードがあります

  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
        }
    })
}
于 2020-07-13T15:17:32.150 に答える
0

ここに少しヘルプ関数があります。あなたの例では、それを次のように呼びます

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();
}
于 2013-03-25T13:53:45.510 に答える
0

タイピング中にライブテキストを変更するのは少し難しいです。次の問題を処理する必要があります。

a。カーソル位置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. ここでは、4文字ごとにスペースを追加しようとしています。最初のスペースを追加すると、テキストの長さは5になります。したがって、次のスペースはそのように9文字の後になります。

    if(strLen == 4 || strLen == 9)

    1. ここでもう1つの問題はカーソルの位置です。編集テキストのテキストを変更すると、カーソルが最初の場所に移動します。したがって、カーソルを手動で設定する必要があります。

    edtAadharNumber.setSelection(edtAadharNumber.getText()。length());

    1. 私のテキストの長さはわずか12文字です。だから私は手動計算をしています、あなたのテキストが動的であるなら、あなたは動的ロジックを書きます。
于 2016-06-09T05:12:44.807 に答える
0

それでも答えを探している人がいる場合は、format-edit-textライブラリを確認してください

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

参照 https://stackoverflow.com/a/59742478/1679946

于 2020-06-22T16:19:07.837 に答える
0

データバインディングを使用している場合追加

android:afterTextChanged="@{handler::afterTextChanged}"    

EditTextおよび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 = ' '

inputType = "numberDigit"を使用している場合、これにより'-'および''文字が無効になるため、inputType="phone"を使用することをお勧めします。

于 2021-02-14T07:14:22.943 に答える
-1

文字列の最終的な長さがわかっていると仮定すると、次のように実装できます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ユーザーが削除していないことを確認することです。そうしないと、ユーザーは在庫を取得します。

コードはKotlinにあり、Javaでもまったく同じ方法で実行できます。

于 2017-10-31T15:49:24.590 に答える
-1

簡単な答え

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


        }
    });
于 2019-02-18T12:09:58.587 に答える