이번 시간에는 오늘 날짜 바탕 색상을 변경해서
오늘이 몇 일인지 알 수 있게 하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.23 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part 5 인터페이스 없이 클릭 이벤트 만들기
- 설명 -
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>
- 설명 -
선택 날짜 변수를 공통 클래스에 옮겼습니다.
이제 selectedDate변수는 공통으로 사용하게 됩니다.
public class CalendarUtil {
public static LocalDate selectedDate; //년월 변수
}
2021.12.31 - [안드로이드] - [안드로이드 스튜디오] 자바 클래스 생성하는 방법
- 설명 -
기존 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
- 설명 -
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 해결방법)
[안드로이드] 커스텀 달력 만드는 방법 part8 이번 달만 색상 변경하기 (5) | 2022.04.26 |
---|---|
[안드로이드] 커스텀 달력 만드는 방법 part7 달력 표시 변경하기 (1) | 2022.04.25 |
[안드로이드] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기 (0) | 2022.04.23 |
[안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (2) | 2022.04.22 |
[안드로이드] 커스텀 달력 만드는 방법 part3 날짜 구현 (3) | 2022.04.21 |
댓글 영역