-1

押されたボタンに応じて EditText が追加および削除するビューを実装しました。また、TextWatcher を使用して数値を金額形式に変更しました。ここまではすべて正常に動作します。

私の問題は、ユーザーが最初の EditText に入力して追加ボタンを押すときです。次に、ユーザーが 2 番目の EditText に入力すると、入力は最初の EditText 文字列と連結され、2 番目の EditText に表示され、最初の EditText も連結されます。したがって、基本的に両方の EditText が同じ文字列になります。これが私のコードです:

    amount = new EditText(this);
    RelativeLayout.LayoutParams etLParams = new RelativeLayout.LayoutParams(
            400, LayoutParams.WRAP_CONTENT);
    etLParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    amount.setInputType(InputType.TYPE_CLASS_NUMBER);
    amount.setLayoutParams(etLParams);
    amount.setId(AMOUNT);
    amount.setSingleLine();
    amount.requestFocus();
    amount.setCursorVisible(true);
    amount.setGravity(Gravity.RIGHT);
    amount.addTextChangedListener(new TextWatcher(){
        String price="";
        private EditText newAmount = new EditText(DutchPayActivity.this);
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            if(!s.toString().equals(price)){
                String cleanString = s.toString().replaceAll("[$,.]", "");
                long parsed = Long.parseLong(cleanString);
                NumberFormat nf = NumberFormat.getInstance();
                price = nf.format(parsed);
                s.append(price); //gave me error:java.lang.NumberFormatException: 66666666666666666666666666666666

                newAmount.setText(price); //same result as before..
                newAmount.setSelection(price.length());
            }
        }
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }
    });

onTextChanged() を試し、カスタム クラスなどを実装しましたが、うまく動作しません。

4

2 に答える 2

1

あなたのコメントで、問題は明らかです。

内部の TexWatcher は を参照しamountます。これは常に、このコードの最後の実行によって作成された EditText です。このコードを 2 回実行して 2 つの EditText を作成した後、それらのいずれかを編集すると、2 番目の EditText を編集する TextWatcher がトリガーされます。

amount解決策: TextWatcher では何もしないでください。提供されたEditableを使用します。

amountまたは、 TextWatcher のプライベート メンバーで複製します。

于 2012-03-07T09:53:07.930 に答える
0

2 番目の EditText を宣言する場所がわかりませんが、この行は疑わしいと思います

    amount.setId(AMOUNT);

動的に作成されたコンポーネントに Id を設定するのはなぜですか? また、設定した ID が既存の ID (おそらく 2 番目の EditText コンポーネントの ID) と衝突している可能性があります。

この問題は、ポインターを混同しているように思えます。リスナーは正しいコンポーネントでトリガーしますが、必要なコンポーネントを指していないポインターに「setText()」します。

これを発見する最も簡単な方法は、Debugger (Eclipse に付属) を使用し、afterTextChanged() リスナーにブレークポイントを設定し、ブレークポイント トリガーが変数が指している場所を検査することです。テキスト セットのプロセスを簡単に実行できることは言うまでもありません。

幸運を!

于 2012-03-07T08:50:03.943 に答える