윈도우 계산기를 기반으로 하여 계산기 앱을 만들어 보았습니다!
Button.OnClickListener onClickListener = new Button.OnClickListener() {
public void onClick(View view) {
//버튼id로 케이스 나누기
switch (view.getId()) {
//숫자버튼
case R.id.btn_0:
if(tv_result.getText().toString().equals("0")) {
tv_result.setText("0");
}
else {
tv_process.setText(tv_process.getText().toString() + "0");
tv_result.setText(tv_result.getText().toString() + "0");
}
break;
//~나머지 생략
//.버튼
case R.id.btn_dot:
if(tv_result.getText().toString().equals("0"))
tv_process.setText("0");
tv_process.setText(tv_process.getText().toString() + ".");
tv_result.setText(tv_result.getText().toString() + ".");
break;
//=버튼
case R.id.btn_result:
tv_process.setText(tv_process.getText().toString() + "=");
num2 = tv_result.getText().toString();
Double num_1 = Double.parseDouble(num1);
Double num_2 = Double.parseDouble(num2);
switch (operator) {
case "+":
tv_result.setText(num_1 + num_2 + "");
break;
//~나머지 생략
case "/":
try {
if(num_2 == 0)
throw new ArithmeticException();
tv_result.setText(num_1/num_2 + "");
}
catch (ArithmeticException e) {
Toast.makeText(getApplicationContext(),"0으로 나눌 수 없습니다", Toast.LENGTH_LONG).show();
}
break;
//~나머지 생략
}
num1 = tv_result.getText().toString();
break;
//연산자버튼
case R.id.btn_plus:
num1 = tv_result.getText().toString();
if(num1.equals("0"))
tv_process.setText("0");
operator = "+";
tv_result.setText("");
tv_process.setText(tv_process.getText().toString() + "+");
break;
//~나머지 생략
//C버튼
case R.id.btn_clear:
tv_process.setText("");
tv_result.setText("0");
operator = "";
num1 = "";
num2 = "";
break;
//DEL버튼
case R.id.btn_del:
String del_process = tv_process.getText().toString();
tv_process.setText(del_process.substring(0,del_process.length() - 1));
String del_result = tv_result.getText().toString();
tv_result.setText(del_process.substring(0,del_process.length() - 1));
}
}
};
btn_0.setOnClickListener(onClickListener); //클릭시 onClickLisntener 호출
}
숫자버튼
숫자버튼 중에서 0버튼은 초기에 tv_result가 0으로 세팅해줬기 때문에 0을 계속 클릭할 경우 0을 계속 추가해주지 않고 0만 보이도록 했습니다. tv_result에 0이 아닌 다른 숫자가 있을 경우에는 숫자를 추가할 수 있도록 해주었습니다
나머지 숫자버튼은 초기에 tv_result가 0으로 세팅되어 있기 때문에 tv_result가 0일 경우 누른 숫자버튼으로 바꾸어주었고, 0이 아닐 경우에는 추가될 수 있도록 해주었습니다.
모든 숫자버튼은 공통적으로 tv_process에 숫자가 계속 추가되어지는 것이 보여지도록 하였습니다.
. (dot)버튼
이 버튼은 숫자버튼과 마찬가지로 눌렀을 때 tv_result 와 tv_process 에 추가되어지도록 하였습니다. 하나 특별한 점은
0을 누르고 이 버튼을 누를 경우 tv_process에 0과 .(dot) 이 같이 추가되어 보이도록 하였습니다.
연산자버튼
연산자버튼은 누를 경우 연산자 누르기 전의 까지의 결과값을 저장하고 tv_result를 초기화해줍니다. 그 다음 연산자를 tv_process 에 추가해줍니다. 0을 누르고 연산자를 누를 경우 0과 연산자가 tv_process에 같이 추가되도록 하였습니다.
=버튼
=버튼을 누를 경우 먼저 tv_process에 "=" 을 추가해주고, 마지막 숫자인 tv_result 값을 가져와서 저장합니다.
그 다음 두 개의 값이 문자열이기 때문에 연산을 위해 숫자로 바꾸어줍니다. switch-case로 경우를 나눠서 각각 연산을 해주고 tv_result에 나타냅니다. 더하기, 빼기, 곱하기의 경우 연산의 결과를 tv_result에 보여줍니다. 나누기의 경우 0으로 나눌 때 예외를 발생시켜 토스트메세지로 알려주도록 하였습니다.
C버튼
C버튼은 모든 것을 초기화해줍니다. tv_process, tv_result 등 모든 것을 초기화해줍니다.
DEL버튼
DEL버튼은 문자열을 지우는 버튼입니다. 값을 가져와서 저장을 한 후 substring() 메소드를 통해 마지막 문자만 빼고 문자열을 잘라낸 후 tv_process 와 tv_result에 보여줍니다.
주의할 점은 버튼.setOnClickListener(onClickListener); 을 꼭 해주어야 동작합니다! 해당 버튼 클릭시 onClickListener로 가서 일을 처리하겠다는 의미입니다.
다음은 실행화면입니다
'Android' 카테고리의 다른 글
[Android] Adapter객체를 생성하면서 만들 수 있는 Adapter 형태 (0) | 2020.09.17 |
---|---|
[Android] 3주차 스터디 (AlertDialog, ListView) (0) | 2020.09.17 |
[Android] Intent(인텐트)로 값 전달하기 (0) | 2020.09.13 |
[Android] 안드로이드 연락처 화면으로 이동하기 (0) | 2020.09.11 |
[Android] 안드로이드 생성주기 (0) | 2020.09.10 |