상세 컨텐츠

본문 제목

[안드로이드] 커스텀 달력 만드는 방법 part7 달력 표시 변경하기

안드로이드

by aries574 2022. 4. 25. 14:16

본문


이번 시간에는 이번 달(4월) 안에 이전 달(3월)과 다음 달(5월)도 같이

나오게 하는 방법을 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.04.24 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기

 

[안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기

이번 시간에는 오늘 날짜 바탕 색상을 변경해서 오늘이 몇 일인지 알 수 있게 하겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.04.23 - [안드로이드] - [안드로이드] 커스텀 달력 만

aries574.tistory.com


1. 실행 화면

2. 메인 코드 수정 MainActivity.java

3. 날짜 어뎁터 수정


1. 실행 화면

 

2. 메인 코드 수정 MainActivity.java

  1. Calendar 추가

Calendar calendar;

 2. Calendar 초기화

        //달력 초기화(오늘 날짜)
        calendar = Calendar.getInstance();

3. daysInMonthArray 수정

 LocalDate -> Date로 타입 변경

 이전 달과 다음 달도 리스트에 등록

 private ArrayList<Date> daysInMonthArray(){

        ArrayList<Date> dayList = new ArrayList<>();

        //날짜 복사해서 변수 생성
        Calendar monthCalendar = (Calendar) calendar.clone();

        //1일로 셋팅 (4월 1일)
        monthCalendar.set(Calendar.DAY_OF_MONTH, 1);

        //요일 가져와서 -1 일요일:1, 월요일:2
        int firstDayOfMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) -1;

        //날짜 셋팅 (-5일전)
        monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth);

        //42전까지 반복
        while(dayList.size() < 42){

            //리스트에 날짜 등록
            dayList.add(monthCalendar.getTime());

            //1일씩 늘린 날짜로 변경 1일 -> 2일 -> 3일
            monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }


        return dayList;
    }

 4. 이전 달 버튼 이벤트 수정

   달 -1 기능 구현

calendar.add(Calendar.MONTH, -1);// -1

 5. 다음 달 버튼 이벤트 수정

   달 +1 기능 구현

calendar.add(Calendar.MONTH, 1); //+1

 6. 전체 코드

public class MainActivity extends AppCompatActivity{

    TextView monthYearText; //년월 텍스트뷰

    RecyclerView recyclerView;

    Calendar calendar;

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

        //초기화
        monthYearText = findViewById(R.id.monthYearText);
        ImageButton preBtn = findViewById(R.id.pre_btn);
        ImageButton nextBtn = findViewById(R.id.next_btn);
        recyclerView = findViewById(R.id.recyclerView);

        //현재 날짜
        CalendarUtil.selectedDate = LocalDate.now();

        //달력 초기화(오늘 날짜)
        calendar = Calendar.getInstance();

        //화면 설정
        setMonthView();

        //이전 달 버튼 이벤트
        preBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //-1한 월을 넣어준다. (2월 -> 1월)
                CalendarUtil.selectedDate = CalendarUtil.selectedDate.minusMonths(1);
                calendar.add(Calendar.MONTH, -1);// -1
                setMonthView();
            }
        });

        //다음 달 버튼 이벤트
        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //+1한 월을 넣어준다.(2월 -> 3월)
                CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusMonths(1);
                calendar.add(Calendar.MONTH, 1); //+1
                setMonthView();
            }
        });
    }//onCreate

    //날짜 타입 설정(4월 2020)
    private String monthYearFromDate(LocalDate date){

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM월 yyyy");

        return date.format(formatter);
    }


    //화면 설정
    private void setMonthView(){

        //년월 텍스트뷰 셋팅
        monthYearText.setText(monthYearFromDate(CalendarUtil.selectedDate));

        //해당 월 날짜 가져오기
        ArrayList<Date> dayList = daysInMonthArray();

        //어뎁터 데이터 적용
        CalendarAdapter adapter = new CalendarAdapter(dayList);

        //레이아웃 설정(열 7개)
        RecyclerView.LayoutManager manager = new GridLayoutManager(getApplicationContext(), 7);

        //레이아웃 적용
        recyclerView.setLayoutManager(manager);

        //어뎁터 적용
        recyclerView.setAdapter(adapter);
    }

    //날짜 생성
    private ArrayList<Date> daysInMonthArray(LocalDate date){

        ArrayList<Date> dayList = new ArrayList<>();

        //날짜 복사해서 변수 생성
        Calendar monthCalendar = (Calendar) calendar.clone();


        //1일로 셋팅 (4월 1일)
        monthCalendar.set(Calendar.DAY_OF_MONTH, 1);

        //요일 가져와서 -1 일요일:1, 월요일:2
        int firstDayOfMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) -1;

        //날짜 셋팅 (-5일전)
        monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth);

        //42전까지 반복
        while(dayList.size() < 42){

            //리스트에 날짜 등록
            dayList.add(monthCalendar.getTime());

            //1일씩 늘린 날짜로 변경 1일 -> 2일 -> 3일
            monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }


        return dayList;
    }
}//MainActivity

 

 

3. 날짜 어뎁터 수정

 1. 리스트 수정 및 생성자 수정

 LocalDate -> Date 타입으로 변경되었습니다. 

    ArrayList<Date> dayList;

    public CalendarAdapter(ArrayList<Date> dayList) {
        this.dayList = dayList;
    }

 2. onBindViewHolder 수정

 LocalDate -> Date 타입으로 변경되었습니다. 

    @Override
    public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {
        
        //날짜 변수에 담기
        Date monthDate = dayList.get(position);

        //달력 초기화
        Calendar dateCalendar = Calendar.getInstance();

        dateCalendar.setTime(monthDate);

        //날짜 변수에 담기
        int dayNo = dateCalendar.get(Calendar.DAY_OF_MONTH);

        holder.dayText.setText(String.valueOf(dayNo));


        //텍스트 색상 지정
        if( (position + 1) % 7 == 0){ //토요일 파랑

            holder.dayText.setTextColor(Color.BLUE);

        }else if( position == 0 || position % 7 == 0){ //일요일 빨강

            holder.dayText.setTextColor(Color.RED);
        }

        //날짜 클릭 이벤트
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //클릭 시 기능 구현
            }
        });

    }

3. 전체 코드

public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>{

    ArrayList<Date> dayList;

    public CalendarAdapter(ArrayList<Date> dayList) {
        this.dayList = dayList;
    }

    @NonNull
    @Override
    public CalendarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        View view = inflater.inflate(R.layout.calendar_cell, parent, false);

        return new CalendarViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {

        //날짜 변수에 담기
        Date monthDate = dayList.get(position);

        //달력 초기화
        Calendar dateCalendar = Calendar.getInstance();

        dateCalendar.setTime(monthDate);

        //날짜 변수에 담기
        int dayNo = dateCalendar.get(Calendar.DAY_OF_MONTH);

        holder.dayText.setText(String.valueOf(dayNo));


        //텍스트 색상 지정
        if( (position + 1) % 7 == 0){ //토요일 파랑

            holder.dayText.setTextColor(Color.BLUE);

        }else if( position == 0 || position % 7 == 0){ //일요일 빨강

            holder.dayText.setTextColor(Color.RED);
        }

        //날짜 클릭 이벤트
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //클릭 시 기능 구현
            }
        });

    }

    @Override
    public int getItemCount() {
        return dayList.size();
    }

    class CalendarViewHolder extends RecyclerView.ViewHolder{

        TextView dayText;

        View parentView;

        public CalendarViewHolder(@NonNull View itemView) {
            super(itemView);

            dayText = itemView.findViewById(R.id.dayText);

            parentView = itemView.findViewById(R.id.parentView);
        }
    }
}

2022.04.12 - [안드로이드] - [안드로이드] 프래그먼트(Fragment)에서 액티비티(Activity) 데이터 전달하는 방법

 

[안드로이드] 프래그먼트(Fragment)에서 액티비티(Activity) 데이터 전달하는 방법

이번 시간에는 프래그먼트에서 액티비티로 데이터 전달하는 방법을 알아보겠습니다. 1. 실행 화면 2. 인터페이스 만들기 3. 프래그먼트 만들기 4. 메인 화면 구성 activity_main.xml 5. 메인 코드 구현 M

aries574.tistory.com

2022.04.11 - [안드로이드] - [안드로이드] 액티비티(Activity)에서 프래그먼트(Fragment) 데이터 전달하는 방법

 

[안드로이드] 액티비티(Activity) 에서 프래그먼트(Fragment) 데이터 전달하는 방법

이번 시간에는 액티비티(Activity)에서 프래그먼트(Fragment)로 데이터 전달하는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 프래그먼트 만들기 3. 메인 화면 구성 activity_main.xml 4. 메인 코드

aries574.tistory.com

2022.04.06 - [안드로이드] - [안드로이드] RecyclerView 다중선택 하는 방법

 

[안드로이드] RecyclerView 다중선택 하는 방법

이번 시간에는 RecyclerView로 리스트를 생성하고, 다중 선택을 하는 방법을 알아보겠습니다. 1. 실행 화면 2. 아이템 클래스 만들기 3. 아이템 화면 만들기 4. 아이템 어뎁터 만들기 5. 메인 화면 구성

aries574.tistory.com

반응형

관련글 더보기

댓글 영역