【问题标题】:TextWatcher not serving its purposeTextWatcher 没有达到其目的
【发布时间】:2013-01-30 10:24:42
【问题描述】:

以下代码 sn-p 用于文本观察器...它不起作用...一切正常,直到最后一行代码...

private TextWatcher mobileTextWatcher = new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        String number = s.toString();
        number = AppConstants.convertToOnlyDigits(number);
        Editable temp = new SpannableStringBuilder(
                AppConstants.formatPhoneNumber(number));
        s = temp;
    }
};

之后新的没有被分配给 s.. 或者换句话说,我在编辑文本中看不到文本的变化。

【问题讨论】:

    标签: android textwatcher


    【解决方案1】:

    您并未更改 s 中的对象,而是将变量 s 替换为另一个对象。

    试试这样的:

    boolean recurseProtection = false;
    @Override
    public void afterTextChanged(Editable s) { 
        if(!recurseProtection) {
            String number = s.toString();
            number = AppConstants.convertToOnlyDigits(number);
            recurseProtection = true;
            s.clear();
            s.append(AppConstants.formatPhoneNumber(number));
            recurseProtection = false;
        }
    }
    

    注意,当您更改 s 对象(我假设它上面放置了一个 DataObserver)时,我添加了一些保护来阻止 afterTextChanged 被调用。递归保护不在我的脑海中,所以可能需要调整。

    希望这会有所帮助。

    【讨论】:

    • 它工作正常...我的错...请编辑您的答案,以便我可以投票
    【解决方案2】:

    由于s 是函数参数,您不能重新分配它并保存超出函数范围的新值。

    如果我正确理解了您的目标 - 您应该通过 setText() 方法将 temp 值分配给 EditText

    【讨论】:

    • 但这会导致无限循环...... s.replace() 会达到目的吗?
    【解决方案3】:

    参数不作为引用传递,所以 s = temp;不会更改edittext中的文本。

    这样试试

    private TextWatcher mobileTextWatcher       =   new TextWatcher() {
            boolean inWatcher = false;
            @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,int after) {
        }
        @Override
        public void afterTextChanged(Editable s) {
            if(inWatcher) { inWatcher = false; return; }
            String number   =   s.toString();
            number          =   AppConstants.convertToOnlyDigits(number);
            Editable temp   =   new SpannableStringBuilder(AppConstants.formatPhoneNumber(number));
            inWatcher = true;
            your_edit_text.setText(temp);
        }
    };
    

    【讨论】:

      【解决方案4】:

      您实际上必须使用 setText() 方法再次设置 EditText 的文本。

      在执行此操作之前,您可能希望添加一个简单的布尔检查作为“mFormatting”,以确保在进行更改后不会进入 textWatcher 调用自身的无限循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多