본문 바로가기
개발일지/안드로이드 JAVA

[안드로이드 프로그래밍 7판] 직접 풀어보기 4-3

by 꾸주니=^= 2023. 1. 12.

> 직접 풀어보기 4-3

181p

[실습 4-1]을 다음과 같이 수정하라.

  • 터치가 아닌 클릭으로 변경한다.
  • 나머지값을 구하는 버튼을 추가한다.
  • 값을 입력하지 않고 버튼을 클릭할 때 오류 메시지를 토스트 메시지로 나타낸다.
  • 실숫값을 계산한다.
  • 0으로 나누면 토스트 메시지를 나타내고 계산하지 않는다.

참고) 나머지 값을 영어로..

remainder

(코드에서는 rex로 변수이름을 설정했습니다)

 

[코드]

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:hint="숫자 1" />

    <EditText
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:hint="숫자 2" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="더하기"
        android:textSize="20dp"
        android:textStyle="bold"
        android:clickable="true"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="빼기"
        android:textSize="20dp"
        android:textStyle="bold"
        android:clickable="true"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="곱하기"
        android:textSize="20dp"
        android:textStyle="bold"
        android:clickable="true"/>

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="나누기"
        android:textSize="20dp"
        android:textStyle="bold"
        android:clickable="true"/>

    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="나머지값"
        android:textSize="20dp"
        android:textStyle="bold"
        android:clickable="true"/>

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/holo_red_light"
        android:textSize="40dp"
        android:textStyle="bold" />
</LinearLayout>

 

MainActivity.java

package com.example.myapplication;

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 edit1;
    EditText edit2;
    TextView textResult;
    Button add;
    Button sub;
    Button mul;
    Button div;
    Button rex;
    String num1, num2;
    Float result;
    String zero = "0";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("초간단 계산기(수정)");

        edit1 = (EditText) findViewById(R.id.text1);
        edit2 = (EditText) findViewById(R.id.text2);

        add = (Button) findViewById(R.id.button1);
        sub = (Button) findViewById(R.id.button2);
        mul = (Button) findViewById(R.id.button3);
        div = (Button) findViewById(R.id.button4);
        rex = (Button) findViewById(R.id.button5);

        textResult = (TextView) findViewById(R.id.text3);

        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                num1 = edit1.getText().toString();
                num2 = edit2.getText().toString();

                if (num1.trim().equals("") || num2.trim().equals("")) {
                    Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
                } else {
                    result = Float.parseFloat(num1) + Float.parseFloat(num2);
                    textResult.setText("계산 결과 : " + result.toString());
                }

            }
        });

        sub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                num1 = edit1.getText().toString();
                num2 = edit2.getText().toString();

                if (num1.trim().equals("") || num2.trim().equals("")) {
                    Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
                } else {
                    result = Float.parseFloat(num1) - Float.parseFloat(num2);
                    textResult.setText("계산 결과 : " + result.toString());
                }
            }
        });

        mul.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                num1 = edit1.getText().toString();
                num2 = edit2.getText().toString();

                if (num1.trim().equals("") || num2.trim().equals("")) {
                    Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
                } else {
                    result = Float.parseFloat(num1) * Float.parseFloat(num2);
                    textResult.setText("계산 결과 : " + result.toString());
                }
            }
        });

        div.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                num1 = edit1.getText().toString();
                num2 = edit2.getText().toString();
                if (num1.trim().equals("") || num2.trim().equals("")) {
                    Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
                } else if (num2.equals(zero)) {
                    Toast.makeText(getApplicationContext(), "0의 값으로 나눌 수 없습니다.", Toast.LENGTH_SHORT).show();
                } else {
                    result = Float.parseFloat(num1) / Float.parseFloat(num2);
                    textResult.setText("계산 결과 : " + result.toString());
                }

            }
        });

        rex.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                num1 = edit1.getText().toString();
                num2 = edit2.getText().toString();

                if (num1.trim().equals("") || num2.trim().equals("")) {
                    Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
                } else if (num2.equals(zero)) {
                    Toast.makeText(getApplicationContext(), "0의 값으로 나눌 수 없습니다.", Toast.LENGTH_SHORT).show();
                } else {
                    result = Float.parseFloat(num1) % Float.parseFloat(num2);
                    textResult.setText("계산 결과 : " + result.toString());
                }
            }
        });

    }
}




 

[실행 결과]

- 값을 구한 모습 (더하기)

- 값을 구한 모습 (빼기)

- 값을 구한 모습 (곱하기)

- 값을 구한 모습 (나누기)

- 값을 구한 모습 (나머지값)

- 값을 입력하지 않고 버튼을 클릭할 시

- 숫자 2를 0으로 나눌 시 (나누기, 나머지값)


* 중요하게 봐야 할 문법 *

div.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        num1 = edit1.getText().toString();
        num2 = edit2.getText().toString();
        if (num1.trim().equals("") || num2.trim().equals("")) {
            Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();
        } else if (num2.equals(zero)) {
            Toast.makeText(getApplicationContext(), "0의 값으로 나눌 수 없습니다.", Toast.LENGTH_SHORT).show();
        } else {
            result = Float.parseFloat(num1) / Float.parseFloat(num2);
            textResult.setText("계산 결과 : " + result.toString());
        }

    }
});

중요하게 봐야할 문법은 당연히 이 부분이지 않을까요..?

 

문제에서 "(1)값을 입력하지 않고 버튼을 클릭할 때 (2)오류 메시지를 토스트 메시지로 나타낸다" 부분이 있습니다.

(1) 값을 입력하지 않고 인터넷 검색을 한 결과 

num1.trim().equals("")

이 문장을 사용하더라고요?

이때, String.trim().equals("")를 이용해서

값을 입력하지 않았을 경우에 오류 메시지를 표시하게 합니다!!

 

(2) 오류 메시지를 토스트 메시지로..

Toast.makeText(getApplicationContext(), "값을 입력하지 않았습니다.", Toast.LENGTH_SHORT).show();

위 문장은

Toast.makeText(출력될 내용, "표시할 메시지", Toast에서 제공하는 출력시간).show();

형태를 가지고 있습니다.

 

이때, Toast에서 제공하는 출력시간을 short 짧게 메시지를 출력해준다는 말을 가지고 있는

Toast.LENGTH_SHORT

을 사용했습니다.

 


* 몰랐던 부분 *

1. 버튼 색상 바꾸기

- 기본으로 설정되어 있는 색상이 purple이여서 버튼 색상을 gray로 바꾸는 방법을 몰랐었습니다.

버튼 색상 바꾸는 방법은 따로 정리해서 올려보겠습니다.

 

간략하게 제가 이해한 것은 res/themes/themes.xml에

<style name="Theme.MyApplication" parent="Theme.AppCompat.DayNight.DarkActionBar">

이 부분을

<style name="Theme.MyApplication" parent="Theme.AppCompat.Light">

Light 값으로 바꾼 것이였습니다.

 

★ 2. toast 메시지 띄우기

코드는 정확하나 toast 메시지가 계속 안 떠서 헤맸었습니다..

toast 메시지 띄우는 방법은 따로 게시물 올리도록 하겠습니다..

 

이 코드에서 toast 메시지가 안 떴던 이유는 .. 제가 앱 알림 설정을 껐더라구요 ..^^;

그래서 알림이 안 떴던 거였습니다  ..ㅋ

 

아무튼 문제 해결!