多个编辑文本框的textChanged方法

时间:2012-01-18 03:00:09

标签: java android

大家好我已经按照以下示例http://www.google.com/codesearch#search/&q=NumberFormattingTextWatcher&exact_package=android&type=cs

我将CurrencyTextWatcher作为单独的类。我需要这个,因为我将申请几页。 我无法弄清楚为什么,但是如果我使用 setContentView(text)它只能用作1个大文本框,那么我就看不到我的xml的剩余部分了。
如果我使用 setContentView(R.layout.main); 我的xml正常工作,除了TextWatcher不会触发我的 txta EditText框

爪哇

public class CalcTestActivity extends Activity {
    private EditText txta;
    private TextView txtb;
    private TextView txtc;
    private EditText text;

    private double a = 0;
    private double b = 0;
    private double c = 0;

    private Button buttonCalc;

    /** Called when the activity is first created. */
    @Override


public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            initControls();
            text = new EditText(this);
            text.addTextChangedListener(new CurrencyTextWatcher());
    //setContentView(text);
        }   

        private String FormatValue(double value)
        {
            NumberFormat nf = NumberFormat.getInstance();
            return "$ "+ nf.format(value);
        }

        private void initControls() {

            txta = (EditText)findViewById(R.id.txta);
            txtb = (TextView)findViewById(R.id.txtb);
            txtc = (TextView)findViewById(R.id.txtc);

            buttonCalc = (Button)findViewById(R.id.buttonCalc);
            buttonCalc.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) {calculate(); }

            private void calculate() {

            a=Double.parseDouble(txta.getText().toString());

            b=Math.round(a*.88);                
            txtb.setText(FormatValue(b));

            c=Math.round((a*.87)-(b*.28));
            txtc.setText(FormatValue(c));
            }

        }); 
        }
    }

CurrencyTextWatcher类

public class CurrencyTextWatcher implements TextWatcher {

boolean mEditing;

public CurrencyTextWatcher() {
    mEditing = false;
}

public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    if(!mEditing) {
        mEditing = true;

        String digits = s.toString().replaceAll("\\D", "");
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        try{
            String formatted = nf.format(Double.parseDouble(digits)/100);
            s.replace(0, s.length(), formatted);
        } catch (NumberFormatException nfe) {
            s.clear();
        }

        mEditing = false;
    } 
}
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

}

}

XML

<TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Number1"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/txta"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:numeric="integer"/>

   <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Number2"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/txtb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Your Answer is"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/txtc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:hint="0" />

    <Button
        android:id="@+id/buttonCalc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Calculate" />

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

我拿了你的代码。我发现你在这里分享的代码是从xml获取所有视图。 在这种情况下,您正在呼叫

 text.addTextChangedListener(new CurrencyTextWatcher());
在你的onCreate方法中

,其中文本是使用java完成的。您不会收到onTextChanged,beforeTextChanged或afterTextChanged的回调,因为您的所有视图都是从xml中获取的。所以请在你的

之后
initControls(); 

在onCreate()中添加以下行

 txta.addTextChangedListener(new CurrencyTextWatcher());

和评论

text.addTextChangedListener(new CurrencyTextWatcher());

不需要该行。我已经证实它的工作正常。

如果作品投票并接受答案

答案 1 :(得分:0)

你在afterTextChanged中实现的代码对onTextChanged实现了相同的代码。它会触发并回拨。

其次,如果视图中存在问题,请检查您的布局及其参数。如果它不合适,它将无法在UI中正确显示