XML
9행 5열
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:rowCount="9"
android:columnCount="5">
<EditText
android:id="@+id/etNum1"
android:textSize="20sp"
android:layout_row="0"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:hint="숫자1"
android:layout_margin="5dp"/>
<EditText
android:id="@+id/etNum2"
android:textSize="20sp"
android:layout_row="1"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:hint="숫자2"
android:layout_margin="5dp"/>
<Button
android:id="@+id/btnNum0"
android:text="0"
android:textSize="20sp"
android:layout_row="2"
android:layout_column="0"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum1"
android:text="1"
android:textSize="20sp"
android:layout_row="2"
android:layout_column="1"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum2"
android:text="2"
android:textSize="20sp"
android:layout_row="2"
android:layout_column="2"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum3"
android:text="3"
android:textSize="20sp"
android:layout_row="2"
android:layout_column="3"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum4"
android:text="4"
android:textSize="20sp"
android:layout_row="2"
android:layout_column="4"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum5"
android:text="5"
android:textSize="20sp"
android:layout_row="3"
android:layout_column="0"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum6"
android:text="6"
android:textSize="20sp"
android:layout_row="3"
android:layout_column="1"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum7"
android:text="7"
android:textSize="20sp"
android:layout_row="3"
android:layout_column="2"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum8"
android:text="8"
android:textSize="20sp"
android:layout_row="3"
android:layout_column="3"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnNum9"
android:text="9"
android:textSize="20sp"
android:layout_row="3"
android:layout_column="4"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnAdd"
android:text="더하기"
android:textSize="20sp"
android:layout_row="4"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_margin="5dp"/>
<Button
android:id="@+id/btnSub"
android:text="빼기"
android:textSize="20sp"
android:layout_row="5"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_margin="5dp"/>
<Button
android:id="@+id/btnMul"
android:text="곱하기"
android:textSize="20sp"
android:layout_row="6"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_margin="5dp"/>
<Button
android:id="@+id/btnDiv"
android:text="나누기"
android:textSize="20sp"
android:layout_row="7"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/tvResult"
android:text="계산 결과 : "
android:textSize="20sp"
android:textColor="#FF0000"
android:layout_row="8"
android:layout_column="0"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_margin="5dp"/>
</GridLayout>
Main Class
package com.example.ch5_gridlayout_ex;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText etNum1, etNum2;
Button btnAdd, btnSub, btnMul, btnDiv;
TextView tvResult;
// Button btnNum0, btnNum1, btnNum2, btnNum3, btnNum4, btnNum5, btnNum6, btnNum7, btnNum8, btnNum9;
// 숫자 버튼 10개 관리하는 다른 방법 - 배열을 사용하여 숫자 버튼에 대한 ID 관리
// Button 위젯의 객체를 저장할 Button 타입 배열 생성
Button[] btnNums = new Button[10]; // => 메서드 내에서 반복문을 사용하여 ID 에 대한 객체를 저장
// Button 위젯에 대한 ID 를 저장할 int형 배열 생성
int[] btnNumsIds = { // 10개의 Button 에 대한 ID 를 배열에 직접 저장
R.id.btnNum0, R.id.btnNum1, R.id.btnNum2, R.id.btnNum3, R.id.btnNum4,
R.id.btnNum5, R.id.btnNum6, R.id.btnNum7, R.id.btnNum8, R.id.btnNum9
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etNum1 = findViewById(R.id.etNum1);
etNum2 = findViewById(R.id.etNum2);
btnAdd = findViewById(R.id.btnAdd);
btnSub = findViewById(R.id.btnSub);
btnMul = findViewById(R.id.btnMul);
btnDiv = findViewById(R.id.btnDiv);
tvResult = findViewById(R.id.tvResult);
// 숫자 Button 위젯 10개에 대한 ID 가져오는 작업을 반복문으로 수행
for(int i = 0; i < btnNumsIds.length; i++) { // ID가 저장된 배열 크기를 조건식으로 사용
// Button 위젯의 ID 가 저장된 배열의 각 요소를 findViewById() 메서드에 전달하여
// 해당 ID 에 대한 위젯 객체를 Button 타입 배열의 각 요소에 저장
btnNums[i] = findViewById(btnNumsIds[i]);
}
// -----------------------------------------------------
// 숫자 버튼 클릭 시 EditText 에 숫자 표시를 위한 이벤트 처리
// => 숫자 버튼 클릭에 대한 작업이 동일하므로 반복문을 사용하여 동일 작업을 처리
for(int i = 0; i < btnNumsIds.length; i++) {
// 내부 클래스에서 외부에 있는 변수 접근 시 해당 변수가 final 이어야한다.
// 그러나, 반복문의 제어변수에 final이 붙을 수 없으므로
// 반복문 제어변수 값을 대신 저장할 변수 1개 필요
final int index = i;
btnNums[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 현재 커서가 위치한 EditText 위젯을 판별 = isFocused() 메서드 활용
if(etNum1.isFocused()) {
etNum1.setText(etNum1.getText().toString() + btnNums[index].getText());
} else if(etNum2.isFocused()) {
etNum2.setText(etNum2.getText().toString() + btnNums[index].getText());
} else {
Toast.makeText(MainActivity.this, "숫자 입력창 선택 필수!", Toast.LENGTH_SHORT).show();
}
}
});
}
// 계산결과 버튼 4단계로 구현
View.OnClickListener operatorListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(etNum1.length() == 0) {
Toast.makeText(MainActivity.this, "숫자1 입력 필수!", Toast.LENGTH_SHORT).show();
etNum1.requestFocus();
return;
} else if(etNum2.length() == 0) {
Toast.makeText(MainActivity.this, "숫자2 입력 필수!", Toast.LENGTH_SHORT).show();
etNum2.requestFocus();
return;
}
// 입력된 숫자 2개 가져와셔 변수에 저장
int num1 = Integer.parseInt(etNum1.getText().toString());
int num2 = Integer.parseInt(etNum2.getText().toString());
int result = 0;
switch(v.getId()) { // 클릭된 View 타입 객체의 ID 가져오기
case R.id.btnAdd:
result = num1 + num2;
break;
case R.id.btnSub:
result = num1 - num2;
break;
case R.id.btnMul:
result = num1 * num2;
break;
case R.id.btnDiv:
if(num1 == 0) {
Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show();
etNum1.requestFocus();
} else if(num2 == 0) {
Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show();
etNum2.requestFocus();
}
result = num1 / num2;
break;
}
// 연산 결과를 TextView에 출력
tvResult.setText("계산 결과 : " + result); // "계산 결과 : "라는 문자열이 없었다면 int형이니 + "" 문자열 붙여줄 필요가 있음
}
};
btnAdd.setOnClickListener(operatorListener);
btnSub.setOnClickListener(operatorListener);
btnMul.setOnClickListener(operatorListener);
btnDiv.setOnClickListener(operatorListener);
}
}
결과
'BackEnd > Android' 카테고리의 다른 글
간단한 예약 프로그램 구현하기 (0) | 2020.06.17 |
---|---|
고급 위젯 - 날짜/시간 관련 (0) | 2020.06.16 |
for문의 초기변수를 내부에서 사용하는 방법 (0) | 2020.06.16 |
레이아웃 (0) | 2020.06.12 |
간단한 계산기 구현하기 (0) | 2020.06.08 |