본문 바로가기
Programing/android

[android studio] DatePickerDialog로 일자달력 사용하기

by Benedictus711 2021. 10. 11.
728x90

DatePickerDialog 을 이용하여 일자를 클릭하면 달력이 나타나고 달력의 일자를 선택하여 사용자가

일자를 선택 및 변경할 수 있는 화면을 만들자.

 

왼쪽 이미지와 같이 만든 후, TextView를 클릭하였을 때 달력이 나타나고,

달력에서 원하는 일자를 클릭하였을 때,

TextView에 선택한 일자가 들어가고자 한다.

 

그리고 일자옆 화살표를 클릭하였을때는 TextView의 일자가 하루단위로 이동하여 일자가 변경될 수 있도록 하고자 하였다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

일단 구현한 전체 코드는 아래와 같다.

public class Fragment_SeaSplitting extends Fragment {

    TextView txt_date;
    ImageButton btn_left;
    ImageButton btn_right;
    DatePickerDialog datePickerDialog;

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat dateParseFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootview = (ViewGroup) inflater.inflate(R.layout.fragment_seasplitting, container, false);

        //초기화
        txt_date = (TextView) rootview.findViewById(R.id.txt_date);
        btn_left = (ImageButton) rootview.findViewById(R.id.btn_left);
        btn_right = (ImageButton) rootview.findViewById(R.id.btn_right);

        //이벤트 처리
        OnClickListener onClickListener = new OnClickListener();

        txt_date.setOnClickListener(onClickListener);
        btn_left.setOnClickListener(onClickListener);
        btn_right.setOnClickListener(onClickListener);

        //금일 일자관련 출력
        long now = System.currentTimeMillis(); //현재시간 가져오기
        Date date = new Date(now); //Date형식으로 Convert

        String getTime = dateFormat.format(date);
        txt_date.setText(getTime);

        return rootview;
    }

    class OnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View view) {

            String str_getDate = txt_date.getText().toString() + " 00:00:00";
            Date date = null;

            switch (view.getId()) {
                case R.id.txt_date:
                    String str_date = txt_date.getText().toString();
                    int i_year = Integer.parseInt(str_date.substring(0,4));
                    int i_month = Integer.parseInt(str_date.substring(5,7));
                    int i_day = Integer.parseInt(str_date.substring(8));

                    //일자 달력 띄우기
                    datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                            //선택일자 Textview에 넣어주기
                            //받아오는 월은 0부터 시작하기때문에 받아온 ii값에 1 더하기
                            txt_date.setText(String.format("%d-%d-%d",i,i1+1,i2));
                        }
                    }, i_year, i_month-1, i_day); //달력의 월이 0부터 시작하여 현재달에서 한달빼기
                    datePickerDialog.show();

                    break;

                case R.id.btn_left:
                    // <- 버튼으로 현재일자에서 하루빼기
                    try {
                        date = fnParseDate(str_getDate);
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(date);
                        cal.add(Calendar.DATE, -1);
                        txt_date.setText(dateFormat.format(cal.getTime()));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    break;
                case R.id.btn_right:
                    // -> 버튼으로 현재일자에서 하루 더하기
                    try {
                        date = fnParseDate(str_getDate);
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(date);
                        cal.add(Calendar.DATE, 1);
                        txt_date.setText(dateFormat.format(cal.getTime()));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    break;
                default:
                    break;
            }
        }
    }

    public Date fnParseDate(String getDate) throws ParseException {
        Date date = dateParseFormat.parse(getDate);
        return date;
    }


}

 

일자를 클릭하였을 때 아래 코드와 같이 DatePickerDialog를 이용하여 달력을 띄우고 선택된 값을 가져와

TextView에 입력될 수 있도록 하였다.

 

//일자 달력 띄우기
                    datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                            //선택일자 Textview에 넣어주기
                            //받아오는 월은 0부터 시작하기때문에 받아온 ii값에 1 더하기
                            txt_date.setText(String.format("%d-%d-%d",i,i1+1,i2));
                        }
                    }, i_year, i_month-1, i_day); //달력의 월이 0부터 시작하여 현재달에서 한달빼기
                    datePickerDialog.show();

위 코드와 같이 작성 한 후 아래 이미지처럼 달력이 출력되고 선택 한 후 확인을 누를시에 선택된 일자가

TextView에 입력되는 것을 확인 하였다.

 

 

아래 코드는

이후 좌우 버튼 클릭시에 아래 코드와 같이 기존 일자 String값을 Date형식으로 Convert 후

일자를 하루 더하거나 뺀 후 다시 TextView에 String값으로 적용할 수 있도록 처리 하였다.

 

 

case R.id.btn_left:
                    // <- 버튼으로 현재일자에서 하루빼기
                    try {
                        date = fnParseDate(str_getDate);
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(date);
                        cal.add(Calendar.DATE, -1);
                        txt_date.setText(dateFormat.format(cal.getTime()));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    break;
                case R.id.btn_right:
                    // -> 버튼으로 현재일자에서 하루 더하기
                    try {
                        date = fnParseDate(str_getDate);
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(date);
                        cal.add(Calendar.DATE, 1);
                        txt_date.setText(dateFormat.format(cal.getTime()));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    break;

 

 

String에서 Date형식으로 전환시에 ParseException사용이 필요하여 따로 parse를 시켜주는 Method를 작성하였다.

전체 코드에서 맨 마지막에 있는 Method가 그것이다.

 

public Date fnParseDate(String getDate) throws ParseException {
        Date date = dateParseFormat.parse(getDate);
        return date;
    }

 

이걸로 동작하는데에 크게 이상없는것을 확인하였다.

 

 

728x90

댓글