상세 컨텐츠

본문 제목

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

안드로이드

by aries574 2022. 4. 24. 13:06

본문


이번 시간에는 오늘 날짜 바탕 색상을 변경해서

오늘이 몇 일인지 알 수 있게 하겠습니다. 

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

2022.04.23 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part 5 인터페이스 없이 클릭 이벤트 만들기

 

[안드로이드] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기

이번 시간에는 part4에서 클릭 이벤트 때문에 인터페이스를 만들어서 구현했습니다. 인터페이스를 쓴 이유는 메인코드에서 어뎁터에 데이터를 넘길 때 숫자만 넘겨서, 어뎁터에서는 해당 년, 월

aries574.tistory.com


목차

1. 실행 화면

2. 날짜화면 수정

3. 공통 클래스 만들기

4. 메인 코드 수정 MainActivity.java

5. 날짜 어뎁터 수정

 


1. 실행 화면

 

2. 날짜화면 수정

- 설명 - 

 LinearLayout 에 아이디를 만들었습니다. 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentView"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="vertical"
    android:padding="8dp">

    <TextView
        android:id="@+id/dayText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="1"
        android:textSize="25sp"
        android:textStyle="bold" />
</LinearLayout>

 

3. 공통 클래스 만들기

 - 설명 -

 선택 날짜 변수를 공통 클래스에 옮겼습니다.

 이제 selectedDate변수는 공통으로 사용하게 됩니다.

 CalendarUtil.java

public class CalendarUtil {

    public static LocalDate selectedDate; //년월 변수
}

2021.12.31 - [안드로이드] - [안드로이드 스튜디오] 자바 클래스 생성하는 방법

 

[안드로이드 스튜디오] 자바 클래스 생성하는 방법

이번 시간에는 안드로이드 스튜디오(AndroidStudio)에서 자바 클래스 생성하는 방법을 알아보겠습니다. 기본으로 안드로이드 스튜디오 프로젝트를 생성하면 아래 화면처럼 MainActivity가 기본으로 생

aries574.tistory.com

 

 

4. 메인 코드 수정 MainActivity.java

 - 설명 - 

 기존 selectedDate는 사라지고 공통 클래스에서 가져다

쓰게 변경되었습니다.

 selectedDate -> CalendarUtil.selectedDate

public class MainActivity extends AppCompatActivity{

    TextView monthYearText; //년월 텍스트뷰

    RecyclerView recyclerView;

    @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();

        //화면 설정
        setMonthView();

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

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

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

                //+1한 월을 넣어준다.(2월 -> 3월)
                CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusMonths(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<LocalDate> dayList = daysInMonthArray(CalendarUtil.selectedDate);

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

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

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

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

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

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

        YearMonth yearMonth = YearMonth.from(date);

        //해당 월 마지막 날짜 가져오기(예 28, 30, 31)
        int lastDay = yearMonth.lengthOfMonth();

        //해당 월의 첫 번째 날 가져오기(예 4월1일)
        LocalDate firstDay = CalendarUtil.selectedDate.withDayOfMonth(1);

        //첫 번째 날 요일 가져오기(월:1 , 일:7)
        int dayOfWeek = firstDay.getDayOfWeek().getValue();

        //날짜 생성
        for(int i = 1; i < 42; i++){

            if( i <= dayOfWeek || i > lastDay + dayOfWeek){

                dayList.add(null);
            }else{
                dayList.add(LocalDate.of(CalendarUtil.selectedDate.getYear(), CalendarUtil.selectedDate.getMonth(),
                        i - dayOfWeek));
            }
        }

        return dayList;
    }
}//MainActivity

 

5. 날짜 어뎁터 수정

 - 설명 -

 1. CalendarViewHolder 변수 추가

 날짜화면에서 LinearLayout에 아이디를 추가했으니

LinearLayout을 변경하기 위해 변수를 추가합니다. 

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);
        }
    }

 2. onBindViewHolder 수정

 메인코드에서 넘어온 날짜와 선택 날짜(selectedDate)를 비교해서 

배경 색상을 변경합니다.

        if(day == null){
            holder.dayText.setText("");
        }else{
            holder.dayText.setText(String.valueOf(day.getDayOfMonth()));

            //현재 날짜 색상 칠하기
            if(day.equals(CalendarUtil.selectedDate)){
                holder.parentView.setBackgroundColor(Color.LTGRAY);
            }
        }

 3. 전체 코드

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

    ArrayList<LocalDate> dayList;

    public CalendarAdapter(ArrayList<LocalDate> 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) {

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


        if(day == null){
            holder.dayText.setText("");
        }else{
            holder.dayText.setText(String.valueOf(day.getDayOfMonth()));

            //현재 날짜 색상 칠하기
            if(day.equals(CalendarUtil.selectedDate)){
                holder.parentView.setBackgroundColor(Color.LTGRAY);
            }
        }

        //텍스트 색상 지정
        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) {

                int iYear = day.getYear();//년
                int iMonth = day.getMonthValue(); //월
                int iDay = day.getDayOfMonth(); //일

                String yearMonDay = iYear + "년 " + iMonth + "월 " + iDay + "일";

                Toast.makeText(holder.itemView.getContext(), yearMonDay, Toast.LENGTH_SHORT).show();
            }
        });

    }

    @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.18 - [안드로이드] - [안드로이드] 기본 카메라 사진 찍고 이미지 뷰에 보여주는 방법(StartActivityForResult deprecated 해결방법)

 

[안드로이드] 기본 카메라 사진 찍고 이미지뷰에 보여주는 방법(StartActivityForResult deprecated 해결방

이번 시간에는 기본 카메라 불러서 사진 찍고 이미지 뷰에 보여주는 방법에 대하여 알아보겠습니다. 기존 startactivityforresult 말고 다른 방식으로 구현했습니다. 목차 1. 실행 화면 2. 메인 화면 구

aries574.tistory.com

2022.04.17 - [안드로이드] - [안드로이드] RelativeLayout 쉽게 사용하는 방법

 

[안드로이드] RelativeLayout 쉽게 사용하는 방법

이번 시간에는 RelativeLayout에 대하여 알아보겠습니다. LinearLayout이 뷰의 위치를 가로, 세로로 구성한다면 RelativeLayout은 상대방의 뷰에 따라 위치를 구성합니다. 직접 해보면 쉽게 사용할 수 있습

aries574.tistory.com

2022.04.16 - [안드로이드] - [안드로이드] LinearLayout 쉽게 사용하는 방법

 

[안드로이드] LinearLayout 쉽게 사용하는 방법

이번 시간에는 LinearLayout을 쉽게 사용하는 방법에 대하여 알아보겠습니다. LinearLayout은 화면의 내용들을 가로나 세로 형태로 배치해줍니다. 가로, 세로를 섞어서 사용할 수도 있습니다. 직접 만

aries574.tistory.com

반응형

관련글 더보기

댓글 영역