마스터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 (230,170 포인트) 님이 2020년 12월 16일 답변
감사합니다 위치때문이였군요,,
...