0

数値を入力すると、計算結果がテキスト フィールドに表示される小さなインターフェイスを作成しようとしています。同じインターフェイスでいくつかの操作を行います。だから私は通常の addtextchangedlistener を試してみましたが、動作しますが、動作させるにはリスナーを追加したすべての editText を埋める必要があることに気付きました。

これが私の最初のコードです:

package be.thebeps.easyconverter;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
import android.text.*;

public class MainActivity extends Activity implements TextWatcher  {

    private Double calcula;
    private EditText calcula1;
    private TextView calcula2;
    private Double calculb;
    private EditText calculb1;
    private TextView calculb2;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        calcula1 = (EditText) findViewById(R.id.calcula1);
        calcula1.addTextChangedListener(this);
        calcula2 = (TextView) findViewById(R.id.calcula2);
        calculb1 = (EditText) findViewById(R.id.calculb1);
        calculb1.addTextChangedListener(this));
        calculb2 = (TextView) findViewById(R.id.calculb2);



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }





    @Override
    public void afterTextChanged(Editable s) {

        try {

            calcula = Double.parseDouble(calcula1.getText().toString());
            calcula = calcula*0.621;
            calcula2.setText(String.format("%.3f", calcula));
            calculb = Double.parseDouble(calculb1.getText().toString());
            calculb = calculb*2.204;
            calculb2.setText(String.format("%.2f", calculb));



        } catch(NumberFormatException nfe) {
            calcula2.setText(Integer.toString(0));
            calculb2.setText(Integer.toString(0));


        }
    }   


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


    }

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


    }   

}

次に、期待どおりに機能しなかったため、各 editText フィールドで textWatcher をインスタンス化するためのクラスを実装しようとしたため、実際のコードは次のとおりです。

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
import android.text.*;

public class MainActivity extends Activity {

    private Double calcula;
    private EditText calcula1;
    private TextView calcula2;
    private Double calculb;
    private EditText calculb1;
    private TextView calculb2;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        calcula1 = (EditText) findViewById(R.id.calcula1);
        calcula1.addTextChangedListener(new CustomTextWatcher(calcula1));
        calcula2 = (TextView) findViewById(R.id.calcula2);
        calculb1 = (EditText) findViewById(R.id.calculb1);
        calculb1.addTextChangedListener(new CustomTextWatcher(calculb1));
        calculb2 = (TextView) findViewById(R.id.calculb2);



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }




    private class CustomTextWatcher implements TextWatcher {
        private EditText mEditText;

        public CustomTextWatcher(EditText e) { 
            mEditText = e;
        }

        @Override
        public void afterTextChanged(Editable s) {

            try {

                calcula = Double.parseDouble(calcula1.getText().toString());
                calcula = calcula*1.451;
                calcula2.setText(String.format("%.3f", calcula));
                calculb = Double.parseDouble(calculb1.getText().toString());
                calculb = calculb*3.206;
                calculb2.setText(String.format("%.2f", calculb));



            } catch(NumberFormatException nfe) {
                calcula2.setText(Integer.toString(0));
                calculb2.setText(Integer.toString(0));

            }
        }   


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


    }

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


    }   

    }
}

それでも、2 つのフィールドの 1 つだけが満たされている場合は、変更しても更新されません (aftertextchanged メソッドが呼び出されないことを意味します)。ビューを作成するときにすでに editText を埋めることを考えていましたが、それでも、誰かが 1 つの editText (たとえば、calcula1) に入り、それをクリアして (eg のバックスペースを使用)、calculb1 に入ると、彼は必要なすべての数値を入力できます。 calcub2 は変更されません。私はそれが難しいことを知っていますし、私はちょっと好き嫌いがありますが、誰かが私を助けてくれればうれしいです.

4

1 に答える 1

0

このコードを最初のコードに入れ、

 @Override
    public void afterTextChanged(Editable s) {
        try {
            calcula = Double.parseDouble(calcula1.getText().toString());
            calcula = calcula*0.621;
            calcula2.setText(String.format("%.3f", calcula));
        } catch(NumberFormatException nfe) {
            Log.e("MainActivity", "NumberFormatException at parseDouble for calculb", nfe);
            calcula2.setText(Integer.toString(0));
        }
        try {
            calculb = Double.parseDouble(calculb1.getText().toString());
            calculb = calculb*2.204;
            calculb2.setText(String.format("%.2f", calculb));
        } catch(NumberFormatException nfe) {
            Log.e("MainActivity", "NumberFormatException at parseDouble for calculb", nfe);
            calculb2.setText(Integer.toString(0));
        }
    }

その理由は、最初の Double.parseDouble() で NFE を取得していたためです。

calcula1.getText().toString() は NULL を返し、NULL を解析すると NFE が 5 になります。

于 2013-04-26T15:00:57.340 に答える