重写getText的EditText

重写getText的EditText,第1张

概述我想覆盖EditText的getText().我收到这样的字符串:“12,345,678”我的目的是仅删除逗号并返回Editable,但是使用我的代码时出现错误.publicclassAmountEditTextextendsEditText{@OverridepublicEditablegetText(){Editables=super.getText();

我想覆盖EditText的getText().

我收到这样的字符串:“ 12,345,678”

我的目的是仅删除逗号并返回Editable,但是使用我的代码时出现错误.

public class AmountEditText extends EditText {    @OverrIDe    public Editable getText() {        Editable s = super.getText();        if(s!=null && s.length()>0) {            if (s.toString().contains(",")) {                return new SpannableStringBuilder(s.toString().replace(",", ""));            }        }        return s;    }    private TextWatcher watcher = 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 position = getSelectionStart();            int nbCommaBefore;            int nbCommaAfter;            String str = s.toString();            String finalStr;            String formattedStr;            nbCommaBefore  = str.length() - str.replace(",", "").length();            boolean containsDot = false;            if (str.contains(".")) {                containsDot = true;                formattedStr = str.split("\.")[0];            } else {                formattedStr = str;            }            if (!s.toString().isEmpty()) {                removeTextChangedListener(watcher);                formattedStr = formattedStr.replace(",", "");                formattedStr = formattedStr.replaceAll("(\d)(?=(\d{3})+$)", ",");                if (containsDot) {                    if (str.split("\.").length != 1) {                        finalStr = formattedStr + "." + str.split("\.")[1].replace(",", "");                    } else {                        finalStr = formattedStr + ".";                    }                } else {                    finalStr = formattedStr;                }                nbCommaAfter  = finalStr.length() - finalStr.replace(",", "").length();                setText(finalStr);                if (position == str.length()){                    setSelection(finalStr.length());                }                else if (position == 0)                {                    setSelection(0);                }                else if (nbCommaBefore < nbCommaAfter){                    setSelection(position + 1);                }                else if (nbCommaAfter < nbCommaBefore){                    setSelection(position - 1);                }                else{                    setSelection(position);                }                addTextChangedListener(watcher);            }        }        @OverrIDe        public voID afterTextChanged(Editable s) {        }    };    public AmountEditText(Context context) {        this(context, null);    }    public AmountEditText(Context context, AttributeSet attrs) {        super(context, attrs);        addTextChangedListener(watcher);    }    public AmountEditText(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        addTextChangedListener(watcher);    }}

E/MessageQueue-JNI: Exception in MessageQueue callback:
handleReceiveCallback E/MessageQueue-JNI:
java.lang.indexoutofboundsexception: setSpan (0 … 5) ends beyond
length 4
at androID.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1265)
at androID.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:684)
at androID.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:677)
at androID.Widget.SpellChecker$SpellParser.setRangeSpan(SpellChecker.java:532)
at androID.Widget.SpellChecker$SpellParser.parse(SpellChecker.java:515)
at androID.Widget.SpellChecker.spellCheck(SpellChecker.java:242)
at androID.Widget.Editor.updateSpellCheckSpans(Editor.java:679)
at androID.Widget.Editor.sendOnTextChanged(Editor.java:1249)
at androID.Widget.TextVIEw.sendOnTextChanged(TextVIEw.java:8191)
at androID.Widget.TextVIEw.setText(TextVIEw.java:4483)
at androID.Widget.TextVIEw.setText(TextVIEw.java:4337)
at androID.Widget.EditText.setText(EditText.java:89)
at androID.Widget.TextVIEw.setText(TextVIEw.java:4312)
at org.newtonproject.newpay.Widgetlib.AmountEditText.onTextChanged(AmountEditText.java:74)

我想精确地指出错误不是来自于onTextChanged
因为在没有覆盖getText()的情况下一切正常

编辑:用户可以输入数字,我将添加一些逗号以格式化数字.但是当我重写getText()时,我想以这种方式删除这些逗号,而不必每次都过滤getText()的返回值.

解决方法:

在您的情况下,您不能覆盖getText()并同时调整大小和使用TextWatcher.

检查下面的AndroID源代码,您将为什么

SpannableStringBuilder.java

public voID setSpan(Object what, int start, int end, int flags) {    setSpan(true, what, start, end, flags, true/*enforceParagraph*/);}private voID setSpan(boolean send, Object what, int start, int end, int flags,            boolean enforceParagraph) {    checkRange("setSpan", start, end);}private voID checkRange(final String operation, int start, int end) {    ...    int len = length();    if (start > len || end > len) {        throw new indexoutofboundsexception(operation + " " +                    region(start, end) + " ends beyond length " + len); // here is you exception    }}public int length() {    return mText.length - mGapLength;}

SpellChecker.java

private voID setRangeSpan(Editable editable, int start, int end) {    ...    editable.setSpan(mRange, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}public voID parse(int start, int end) {    ...    if (parseEnd > start) {        setRangeSpan((Editable) mTextVIEw.getText(), start, parseEnd); // I think the error happened from here, they use your getText() function here and receive shorter string, but the start, parseEnd still stick with original string        parse();    }}

解决方法.
您可以简单地定义一个新函数,例如getBeautifulText().

总结

以上是内存溢出为你收集整理的重写getText的EditText全部内容,希望文章能够帮你解决重写getText的EditText所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1210161.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存