-1

次のコードスニペットは、テキストウォッチャーに使用されます...機能しません...コードの最後の行まで、すべてが正常に機能します...

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に割り当てられません。つまり、[テキストの編集]のテキストに変更が表示されません。

4

4 に答える 4

0

のオブジェクトを変更するので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;
    }
}

afterTextChangedオブジェクトを変更したときに呼び出されないようにするための保護を追加したことに注意してくださいs(DataObserverが配置されていると思います)。再帰保護は頭のてっぺんから外れているので、微調整が必​​要な場合があります。

お役に立てれば。

于 2013-01-30T10:37:07.127 に答える
0

関数の引数と同様sに、それを再割り当てして、関数の範囲を超えて新しい値を保存することはできません。

EditText私があなたの目標を正しく理解していれば、setText()方法で一時値を割り当てる必要があります

于 2013-01-30T10:33:34.470 に答える
0

パラメータは参照として渡されないため、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);
    }
};
于 2013-01-30T10:33:39.520 に答える
0

setText() メソッドを使用して、実際に EditText のテキストを再度設定する必要があります。

これを行う前に、単純なブール値チェックを「mFormatting」として追加して、変更後に textWatcher 自体を呼び出す無限ループに陥らないようにすることをお勧めします。

于 2013-01-30T10:34:04.747 に答える