본문 바로가기

모바일 프로그래밍(Android Studio)

Timer 앱

▶ xml 파일

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

    <TextView
        android:id="@+id/txtTimer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="173dp"
        android:layout_marginTop="79dp"
        android:layout_marginEnd="181dp"
        android:text="남은시간"
        android:textSize="32sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/txtCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="143dp"
        android:layout_marginTop="80dp"
        android:layout_marginEnd="143dp"
        android:text="탭한 갯수"
        android:textSize="32sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtTimer" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="160dp"
        android:layout_marginTop="100dp"
        android:layout_marginEnd="151dp"
        android:text="Tab!!!"
        android:textSize="32sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.647"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtCount" />
</androidx.constraintlayout.widget.ConstraintLayout>

▶ mainActivity 파일

package com.example.timer;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView txtTimer;
    TextView txtCount;
    Button button;

    int count = 0;

    boolean isFinish = false;

    CountDownTimer timer;


    private void showAlertDialog(){ // 3개 제공해준다
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("타이머 끝~");
        builder.setMessage("클릭한 갯수: "+count);
        // 이 다이얼 로그의 외곽 부분을 눌렀을 때, 사라 지지 않도록 하는 코드
        builder.setCancelable(false);
        builder.setPositiveButton("다시 도전", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                count = 0;
                isFinish = false;
                txtCount.setText(count+ "번");

                timer.start();
            }
        });
        builder.setNegativeButton("종료", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                // 현재의 액티비티(MainActivity)를 종료시키는 코드! 앱을 종료시키는게 아님
                finish();
            }
        });
        builder.show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtTimer = findViewById(R.id.txtTimer);
        txtCount = findViewById(R.id.txtCount);
        button = findViewById(R.id.button);
        
        // 타이머를 만든다.
        // 밀리새컨즈라 7초라면 7000이라 써야한다 두번째 파라미터는 몇초씩 줄어드나라는뜻
        timer = new CountDownTimer(7000,1000) {
            @Override
            public void onTick(long l) {
                // 두번째 파라미터만큼 줄때마다 실행하는 함수
                // 남은시간을 화면에 표시한다.
                long remain = l/1000; // 컴퓨터언어를 사람이 보기 편하게 잘 바꿔줘야한다!
                txtTimer.setText(remain + "초");
            }

            @Override
            public void onFinish() {
                // 타이머가 종료될때 실행되는 함수
                // 알러트 다이얼로그 띄어서, 다시 도전할지, 종료할지 보여줄것

                isFinish =  true;
                showAlertDialog();
            }
        };
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(isFinish){
                    return;
                }
                count = count + 1;
                txtCount.setText(count+ "번");
            }
        });
        timer.start();
    }
}
더보기

private void showAlertDialog(){ // 3개 제공해준다
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("타이머 끝~");
        builder.setMessage("클릭한 갯수: "+count);
        // 이 다이얼 로그의 외곽 부분을 눌렀을 때, 사라 지지 않도록 하는 코드
        builder.setCancelable(false);
        builder.setPositiveButton("다시 도전", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                count = 0;
                isFinish = false;
                txtCount.setText(count+ "번");

                timer.start();
            }
 });

+ 메모리 관련 추가설명 필요