Mert Yağlı
Mert Yağlı

Reputation: 13

How to handle not filled EditText in Android

I want to code a simple calculator with 3 inputs (NUM1,NUM2,NUM3), 3 buttons(SUM,SUB,MUL) and 1 RESULT text plane. In my app if I give all inputs, the app works correctly. However if I don't give any input for 1 field, I encounter app stopped error. I want to make my app work with any number of inputs.

Here is my code.

public void onButtonClickSum(View v){
    EditText e1 = (EditText)findViewById(R.id.editText);
    EditText e2 = (EditText)findViewById(R.id.editText2);
    EditText e3 = (EditText)findViewById(R.id.editText3);

    TextView t1 = (TextView)findViewById(R.id.textView2);

    int num1 = Integer.parseInt(e1.getText().toString());
    int num2 = Integer.parseInt(e2.getText().toString());
    int num3 = Integer.parseInt(e3.getText().toString());

    int sum = num1 + num2 + num3;

    t1.setText(Integer.toString(sum));

}

public void onButtonClickSub(View v){
    EditText e1 = (EditText)findViewById(R.id.editText);
    EditText e2 = (EditText)findViewById(R.id.editText2);
    EditText e3 = (EditText)findViewById(R.id.editText3);

    TextView t1 = (TextView)findViewById(R.id.textView2);

    int num1 = Integer.parseInt(e1.getText().toString());
    int num2 = Integer.parseInt(e2.getText().toString());
    int num3 = Integer.parseInt(e3.getText().toString());

    int sub = num1 - num2 - num3;

    t1.setText(Integer.toString(sub));
}

public void onButtonClickMul(View v){
    EditText e1 = (EditText)findViewById(R.id.editText);
    EditText e2 = (EditText)findViewById(R.id.editText2);
    EditText e3 = (EditText)findViewById(R.id.editText3);

    TextView t1 = (TextView)findViewById(R.id.textView2);

    int num1 = Integer.parseInt(e1.getText().toString()); 
    int num2 = Integer.parseInt(e2.getText().toString());
    int num3 = Integer.parseInt(e3.getText().toString());

    int mul = num1 * num2 * num3;

    t1.setText(Integer.toString(mul));
}

Upvotes: 1

Views: 493

Answers (3)

Aakash
Aakash

Reputation: 5251

Try doing this and same for other methods:

EditText e1 ,e2, e3;
TextView t1;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1 = (EditText)findViewById(R.id.editText);
        e2 = (EditText)findViewById(R.id.editText2);
        e3 = (EditText)findViewById(R.id.editText3);

        t1 = (TextView)findViewById(R.id.textView2);
     }
    public void onButtonClickSum(View v){
    if(e1.getText().toString().length()==0){
    e1.setError("Required");
    }
    else if(e2.getText().toString().length()==0){
    e2.setError("Required");
    }
    else if(e3.getText().toString().length()==0){
    e3.setError("Required");
    }
    else{
        int num1 = Integer.parseInt(e1.getText().toString());
        int num2 = Integer.parseInt(e2.getText().toString());
        int num3 = Integer.parseInt(e3.getText().toString());

        int sum = num1 + num2 + num3;

        t1.setText(Integer.toString(sum));
    }
    }

Upvotes: 0

Deepak Goyal
Deepak Goyal

Reputation: 4907

Change from

int num1 = Integer.parseInt(e1.getText().toString());
int num2 = Integer.parseInt(e2.getText().toString());
int num3 = Integer.parseInt(e3.getText().toString());

to

int num1 = 0, num2 = 0, num3 = 0;
int num1_error = 0, num2_error = 0, num3_error = 0;
try{
  num1 = Integer.parseInt(e1.getText().toString());
}Catch(Exception e){
  num1_error = 1;
}

try{
  num2 = Integer.parseInt(e2.getText().toString());
}Catch(Exception e){
  num2_error = 1;
}

try{
  num3 = Integer.parseInt(e3.getText().toString());
}Catch(Exception e){
  num3_error = 1;
}

// for addition
    int sum = 0;
    if(num1_error == 0){
      sum += num1;
    }

    if(num2_error == 0){
      sum += num2;
    }

    if(num1_error == 0){
      sum += num3;
    }

    t1.setText(Integer.toString(sum));

// for subtraction
    int sub = 0;
    if(num1_error == 0){
      sub = num1 - sub;
    }

    if(num2_error == 0){
      sub = sub - num2;
    }

    if(num3_error == 0){
      sub = sub - num3;
    }

    t1.setText(Integer.toString(sub));

// for multiplication
    int mul = 1;
    if(num1_error == 0){
      mul = mul*num1;
    }

    if(num2_error == 0){
      mul = mul*num2;
    }

    if(num3_error == 0){
      mul = mul*num3;
    }

    t1.setText(Integer.toString(mul));

Upvotes: 0

Kyle Phillips
Kyle Phillips

Reputation: 111

  • You need to put null or empty checks before you parse the input as integers
  • Try making the EditText objects fields, since you are reusing them in each method

Example:

// Fields
private EditText mEditText1 = (EditText)findViewById(R.id.editText);
private EditText mEditText2 = (EditText)findViewById(R.id.editText2);
private EditText mEditText3 = (EditText)findViewById(R.id.editText3);
private TextView mTextView = (TextView)findViewById(R.id.textView2);

public void onButtonClick(View v){
  int num1 = 0;
  int num2 = 0;
  int num3 = 0;

  String e1 = mEditText1.getText();
  String e2 = mEditText2.getText();
  String e3 = mEditText3.getText();

  if(!e1.isEmpty()) {
    num1 = Integer.parseInt(e1);
  }
  if(!e2.isEmpty()){
    num2 = Integer.parseInt(e2);
  }
  if(!e3.isEmpty()){
    num3 = Integer.parseInt(e3);
  }

  int sub = num1 - num2 - num3;

  mTextView.setText(Integer.toString(sub));
}

Upvotes: 1

Related Questions