如何在编辑EditText字段时重新定位光标,该字段的格式类似于美国货币-Android

卡维塔

我正在按照美国货币格式设置编辑文本字段的格式,在该字段中输入数字时,假设“ 12345678”看起来像“ 12,345,678”。为此,我TextWatcherafterTextChanged(...)方法使用了格式化输入的文本的格式:

@Override
    public void afterTextChanged(Editable editable) {
        String str = editable.toString();
        String number = str.replaceAll("[,]", "");
        if (number.equals(previousNumber) || number.isEmpty()) {
            return;
        }
        previousNumber = number;

        DecimalFormat formatter = new DecimalFormat("#,###.##", new DecimalFormatSymbols(Locale.US));

        String formattedString = formatter.format(number);
        editText.setText(formattedString);
    }

另外,我正在使用onSelectionChanged(...)类似的回调方法:

 @Override
protected void onSelectionChanged(int selStart, int selEnd) {
    this.setSelection(selStart);
}

但是在这里,此“ selStart”不返回数字的实际长度,因为它排除了每种货币中的“,”数字。例如:对于“ 12,345,678”,它返回的计数为8而不是10。这就是为什么我不能将光标放在该字段的末尾。

以下是我正在使用的自定义EditText的代码:

public class CurrencyEditText extends AppCompatEditText {
private static final int MAX_LENGTH = 16;
private static final int MAX_DECIMAL_DIGIT = 2;
private static String prefix = "";
private CurrencyTextWatcher currencyTextWatcher = new CurrencyTextWatcher(this, prefix);

public CurrencyEditText(Context context) {
    this(context, null);
}

public CurrencyEditText(Context context, AttributeSet attrs) {
    this(context, attrs, android.support.v7.appcompat.R.attr.editTextStyle);
}

public CurrencyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
}

@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        this.addTextChangedListener(currencyTextWatcher);
    } else {
        this.removeTextChangedListener(currencyTextWatcher);
    }
    handleCaseCurrencyEmpty(focused);
}

private void handleCaseCurrencyEmpty(boolean focused) {
    if (!focused) {
        if (getText().toString().equals(prefix)) {
            setText("");
        }
    }
}

private static class CurrencyTextWatcher implements TextWatcher {
    private final EditText editText;
    DecimalFormat formatter;
    private String previousNumber;
    private String prefix;
    Context mContext;

    CurrencyTextWatcher(EditText editText, String prefix) {
        this.editText = editText;
        this.prefix = prefix;
        formatter = new DecimalFormat("#,###.##", new DecimalFormatSymbols(Locale.US));
    }

    @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 editable) {
        String str = editable.toString();
        String number = str.replaceAll("[,]", "");
        if (number.equals(previousNumber) || number.isEmpty()) {
            return;
        }
        previousNumber = number;

        String formattedString = prefix + formatNumber(number);
        editText.removeTextChangedListener(this);
        editText.setText(formattedString);
        //handleSelection();
        editText.addTextChangedListener(this);
    }

    private String formatNumber(String number) {
        if (number.contains(".")) {
            return formatDecimal(number);
        }
        return formatInteger(number);
    }

    private String formatInteger(String str) {
        BigDecimal parsed = new BigDecimal(str);
        return formatter.format(parsed);
    }

    private String formatDecimal(String str) {
        if (str.equals(".")) {
            return "0.";
        }
        BigDecimal parsed = new BigDecimal(str);
        DecimalFormat formatter = new DecimalFormat("#,##0." + getDecimalPattern(str),
                new DecimalFormatSymbols(Locale.US));
        formatter.setRoundingMode(RoundingMode.DOWN);
        return formatter.format(parsed);
    }

    private String getDecimalPattern(String str) {
        int decimalCount = str.length() - str.indexOf(".") - 1;
        StringBuilder decimalPattern = new StringBuilder();
        for (int i = 0; i < decimalCount && i < MAX_DECIMAL_DIGIT; i++) {
            decimalPattern.append("0");
        }
        return decimalPattern.toString();
    }

    /*private void handleSelection() {
        if (editText.getText().length() <= MAX_LENGTH) {
            editText.setSelection(editText.getText().length());
        }
    }*/
}

@Override
protected void onSelectionChanged(int selStart, int selEnd) {
    this.setSelection(selStart);
}

}

我不想使用,this.setSelection(lengthOfTheEnteredText)因为它在您编辑字段时创建了问题!onSelectionChanged(...)不考虑数字“,”计数的原因可能是什么

卡维塔

在对该问题进行了更多探索之后,我找到了解决方案。我在哪里计算光标位置。我已经onSelectionChanged(...)从代码中删除了方法,并且正在处理afterTextChanged(...)方法中的选择在以下代码中,我对进行了更改afterTextChanged(...)

@Override
    public void afterTextChanged(Editable editable) {

        String str = editable.toString();
        String number = str.replaceAll("[,]", "");
        if (number.equals(previousNumber) || number.isEmpty()) {
            return;
        }
        previousNumber = number;

        int startText, endText;
        startText = editText.getText().length();

        int selectionStart = editText.getSelectionStart();

        String formattedString = prefix + formatNumber(number);
        editText.removeTextChangedListener(this);
        editText.setText(formattedString);
        endText = editText.getText().length();

        int selection = (selectionStart + (endText - startText));
        editText.setSelection(selection);

        editText.addTextChangedListener(this);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

点击时在表视图上的键盘上方重新定位文本字段(类似于whatsapp)

如何在Android中保持和拖动(重新定位)布局及其关联的布局

如何在Android编辑字段中格式化字符串号以使其带有逗号

如何从Android的货币格式还原?

如何在android中创建类似于fb的事件表单

如何在VSCode中将编辑器窗口重新定位在光标上?

如何格式化字符串编号以在android编辑字段中留出空间

如何在Android中以编程方式更改Edittext光标颜色?

如何在Android中的EditText中移动光标

如何在Android Studio中的编辑文本中移动光标

Android:当用户键入EditText时创建倒数单词字段

如何在目标C中创建类似Android的Edittext(TextInputLayout)?

Android EditText闪烁光标

如何在Android中使用类似标签的编辑文本

我如何在Android中使用JavaScript将Edittext值放入WebView的文本字段中

如何创建类似于Android中附件的可折叠edittext区域

Android Chrome中意外的插入符重新定位

Android防止嵌套的recyclerview自动重新定位

解决xamarin android“路径太长”而无需重新定位

Android Google Map Marker 未正确重新定位

如何在Android中制作可点击和可编辑的文本字段?

Android EditText imeOptions使actionSearch的行为类似于actionDone?

Android EditText(TextView)如何绘制闪烁的光标?

Android软键盘涵盖EditText字段

Android-无法自动选择EditText字段

无法从Android的EditText字段获取输入

EditText获取android空字段的值

Android Studio EditText字段为null或0

类似于TreeView Android的ExpandableListview