커스텀 캘린더뷰를 작성중에 있는데, add decorater로 달력에 효과를 주는 것에 있어서 오류가 떠서 이렇게 작성해봅니다.
1) add decorater로 인해 java.lang.NullPointerException: Attempt to invoke virtual method이런 오류가 뜹니다. 오류가 뜨는 부분은 아래 주석처리를 한 부분입니다. 어디에서 null이 나는 것인지 잘 모르겠습니다.ㅜㅜ
2) 데이터가 있을 때, 빨간점을 찍는 이벤트를 구현할 수 있는 함수가 어떤 함수인지 알 수 있을까요?
package com.hanium.android.maeumi.view.diary;
import android.app.Activity;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.hanium.android.maeumi.R;
import com.prolificinteractive.materialcalendarview.CalendarDay;
import com.prolificinteractive.materialcalendarview.CalendarMode;
import com.prolificinteractive.materialcalendarview.MaterialCalendarView;
import com.prolificinteractive.materialcalendarview.OnDateSelectedListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.Executors;
//@Bind(R.id.calendarView)
//MaterialCalendarView materialCalendarView;
public class DiaryCalendarTest extends Activity {
String time, kcal, menu;
private final OneDayDecorator oneDayDecorator = new OneDayDecorator();
Cursor cursor;
MaterialCalendarView materialCalendarView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendartest);
//bind 대신 findViewById 이용
MaterialCalendarView materialCalendarView = findViewById(R.id.calendarView);
materialCalendarView.state().edit()
.setFirstDayOfWeek(Calendar.SUNDAY)
.setMinimumDate(CalendarDay.from(1900, 0, 1)) // 달력의 시작
.setMaximumDate(CalendarDay.from(2900, 11, 31)) // 달력의 끝
.setCalendarDisplayMode(CalendarMode.MONTHS)
.commit();
materialCalendarView.addDecorators(
new SunDayDecorator(), //토요일 색
new SaturDayDecorator(), //일요일 색
oneDayDecorator);
String[] result = {"2017,03,18", "2017,04,18", "2017,05,18", "2017,06,18"};
new ApiSimulator(result).executeOnExecutor(Executors.newSingleThreadExecutor());
//클릭 이벤트
materialCalendarView.setOnDateChangedListener(new OnDateSelectedListener() {
@Override
public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
int Year = date.getYear();
int Month = date.getMonth() + 1;
int Day = date.getDay();
Log.i("Year test", Year + "");
Log.i("Month test", Month + "");
Log.i("Day test", Day + "");
String shot_Day = Year + "," + Month + "," + Day;
Log.i("shot_Day test", shot_Day + "");
materialCalendarView.clearSelection();
Toast.makeText(getApplicationContext(), shot_Day, Toast.LENGTH_SHORT).show();
}
});
}
private class ApiSimulator extends AsyncTask<Void, Void, List<CalendarDay>> {
String[] Time_Result;
ApiSimulator(String[] Time_Result) {
this.Time_Result = Time_Result;
}
@Override
protected List<CalendarDay> doInBackground(@NonNull Void... voids) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
ArrayList<CalendarDay> dates = new ArrayList<>();
/*특정날짜 달력에 점표시해주는곳*/
/*월은 0이 1월 년,일은 그대로*/
//string 문자열인 Time_Result 을 받아와서 ,를 기준으로짜르고 string을 int 로 변환
for (int i = 0; i < Time_Result.length; i++) {
CalendarDay day = CalendarDay.from(calendar);
String[] time = Time_Result[i].split(",");
int year = Integer.parseInt(time[0]);
int month = Integer.parseInt(time[1]);
int dayy = Integer.parseInt(time[2]);
dates.add(day);
calendar.set(year, month - 1, dayy);
}
return dates;
}
// @Override
// protected void onPostExecute(@NonNull List<CalendarDay> calendarDays) {
// super.onPostExecute(calendarDays);
//
// if (isFinishing()) {
// return;
//
// public void addDecorator(EventDecorator); {
// materialCalendarView.addDecorator(new EventDecorator(Color.GREEN, calendarDays, DiaryCalendarTest.this));
// }
// }
// }
}
}