마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼이 반응하지 않습니다(프래그먼트 화면)

0 추천
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class Fragment_timer extends AppCompatActivity {
    Button button_start, button_reset, button_end;
    EditText time_min, time_sec;
    InputMethodManager imm;

    Handler handler = new Handler(){
        public void handleMessage(Message message) {
            String time = getTimeOut();

            if(time.equals("00:00")){
                reset();
            }
            else {
                handler.sendEmptyMessage(0);
            }
        }
    };

    final static int INIT = 0;
    final static int RUN = 1;
    final static int PAUSE = 2;

    int cur_status = INIT;

    long baseTime;
    long pauseTime;
    long setTime;

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

        imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        time_min = findViewById(R.id.time_min);

        time_min.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(time_min.hasFocus() && getEditTime() != 0){
                    setTime();
                    Log.d("ProgressTest","setTime = " + setTime);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        time_sec = findViewById(R.id.time_sec);
        time_sec.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(time_sec.hasFocus() && getEditTime() != 0){
                    setTime();
                    Log.d("ProgressTest","setTime = " + setTime);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        button_start.findViewById(R.id.button_start);
        button_reset.findViewById(R.id.button_reset);

        button_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(getEditTime() != 0){
                    //키보드 숨기기
                    hideKeyboard();
                    start(cur_status);
                }
                else
                {
                    Toast.makeText(Fragment_timer.this, "시간을 입력하시오. 25분 추천.", Toast.LENGTH_SHORT).show();
                    time_min.requestFocus();
                }
            }
        });

        button_reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                reset();
            }
        });

    }

    public void reset(){
        handler.removeCallbacksAndMessages(null);
        cur_status = INIT;
        setTime = 0;

        time_min.setText("00");
        time_min.setEnabled(true);
        time_sec.setText("00");
        time_sec.setEnabled(true);

        button_start.setText("시작");
        button_reset.setEnabled(false);
    }

    public void hideKeyboard(){
        imm.hideSoftInputFromWindow(time_min.getWindowToken(),0);
        imm.hideSoftInputFromWindow(time_sec.getWindowToken(),0);
    }

    public long getEditTime(){
        long min = Long.parseLong(time_min.getText().toString())* 60 * 1000;
        long sec = Long.parseLong(time_sec.getText().toString())* 1000;
        return min+sec;
    }

    public void start(int status){
        switch (status) {
            case INIT:
                baseTime = SystemClock.elapsedRealtime();
                button_start.setText("멈춤");

                button_reset.setEnabled(false); //버튼비활성

                //edittext 비활
                time_min.setEnabled(false);
                time_sec.setEnabled(false);

                handler.sendEmptyMessage(0);
                cur_status = RUN;

                break;

            case RUN:
                handler.removeMessages(0);
                pauseTime = SystemClock.elapsedRealtime();
                button_start.setText("재시작");
                button_reset.setEnabled(true);
                cur_status = PAUSE;
                break;

            case PAUSE:
                long now = SystemClock.elapsedRealtime();

                baseTime += (now-pauseTime);
                button_start.setText("멈춤");
                button_reset.setEnabled(false);
                handler.sendEmptyMessage(0);
                cur_status = RUN;
                break;
        }
    }

    public String getTimeOut(){
        long now = SystemClock.elapsedRealtime();
        long outTime = baseTime-now+setTime;

        long sec = outTime/1000%60;
        long min = outTime/1000/60;

        if(outTime%1000/10 != 0 && sec < 60) {
            sec += 1;
            if(sec ==60) {
                sec = 0;
                min += 1;
            }
        }

        String easy_outTime = String.format("%02d:02d",min,sec);
        String[] times = easy_outTime.split(":");

        time_min.setText(times[0]);
        time_sec.setText(times[1]);
        return easy_outTime;
    }

    public void setTime() {
        setTime = Long.parseLong(time_min.getText().toString()) * 1000 * 60
                + Long.parseLong(time_sec.getText().toString()) * 1000;
    }
}

프래그먼트 화면에 타이머 구현을 위해 버튼과 edittext를 넣었습니다.

실행은 잘 되는데 버튼을 눌러도 반응이 없습니다.

xml파일의 아이디, 자바와 xml 파일 이름, 파일 지정은 잘 됐습니다.

https://everyshare.tistory.com/32 소스는 이 곳을 참고했고,

여기서 프로그래스바 코드를 제외하고 코딩했습니다.

이유를 모르겠습니다 ㅠㅠ

프뤼 (120 포인트) 님이 2020년 12월 16일 질문

1개의 답변

0 추천
handler.sendEmptyMessage(0);
cur_status = RUN;

둘의 위치가 바뀐 것 같은데요. cur_status가 다음 상태로 바뀌어야 handler.sendEmptyMesssage(0)가 호출될 때 다음 상태로 가겠죠. 현재 코드로는 계속 같은 상태만 호출될 것 처럼 보이는데요. 다른 case도 마찬가지일 것 같구요.

cur_status = RUN;
handler.sendEmptyMessage(0);
spark (227,470 포인트) 님이 2020년 12월 16일 답변
감사합니다 위치때문이였군요,,
...