我正在制作日历,但是当我点击日历日时,它会崩溃。 我多次检查代码,但它一直在崩溃。
我要发布相关代码和logcat。
谢谢
MonthNewFragment.JAVA
public class MonthNewFragment extends Fragment implements View.OnClickListener {
private final Utils utils = Utils.getInstance();
private CalendarMainFragment calendarMainFragment;
private PersianDate persianDate;
public MonthNewFragment monthNewFragment;
public MonthAdapter monthAdapter;
public CalendarAdapter calendarAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.calendar_month, container, false);
int offset = getArguments().getInt("offset");
List<DayEntity> days = utils.getDays(getContext(), offset);
char[] digits = utils.preferredDigits(getActivity());
IconTextView prev = (IconTextView) view.findViewById(R.id.prev);
IconTextView next = (IconTextView) view.findViewById(R.id.next);
prev.setOnClickListener(this);
next.setOnClickListener(this);
persianDate = utils.getToday();
int month = persianDate.getMonth() - offset;
month -= 1;
int year = persianDate.getYear();
year = year + (month / 12);
month = month % 12;
if (month < 0) {
year -= 1;
month += 12;
}
month += 1;
persianDate.setMonth(month);
persianDate.setYear(year);
persianDate.setDayOfMonth(1);
TextView currentMonthTextView = (TextView) view.findViewById(R.id.currentMonthTextView);
currentMonthTextView.setText(Utils.textShaper(utils.getMonthName(persianDate)));
TextView currentYearTextView = (TextView) view.findViewById(R.id.currentYearTextView);
currentYearTextView.setText(Utils.formatNumber(persianDate.getYear(), digits));
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.RecyclerView);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getContext(), 7);
recyclerView.setLayoutManager(layoutManager);
monthAdapter = new MonthAdapter(getActivity(), this, days);
monthAdapter = new MonthAdapter(getActivity(), this, days);
recyclerView.setAdapter(monthAdapter);
calendarMainFragment = (CalendarMainFragment) getActivity()
.getSupportFragmentManager()
.findFragmentByTag(CalendarMainFragment.class.getName());
if (calendarMainFragment != null) {
calendarMainFragment.selectDay(utils.getToday());
}
return view;
}
public void onClickItem(PersianDate day) {
calendarMainFragment.selectDay(day);
}
public void onLongClickItem(PersianDate day) {
calendarMainFragment.addEventOnCalendar(day);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.next:
calendarMainFragment.changeMonth(1);
break;
case R.id.prev:
calendarMainFragment.changeMonth(-1);
break;
}
}
}
MonthAdapter.JAVA
public class MonthAdapter extends RecyclerView.Adapter<MonthAdapter.ViewHolder> {
private final Context context;
public final CalendarMainFragment calendarMainFragment;
private final MonthNewFragment monthNewFragment;
private static final int TYPE_HEADER = 0;
private static final int TYPE_DAY = 1;
private List<DayEntity> days;
private int selectedDay = -1;
public MonthAdapter(Context context, MonthNewFragment monthNewFragment, List<DayEntity> days) {
this.monthNewFragment = monthNewFragment;
this.context = context;
this.days = days;
calendarMainFragment = null;
}
**CalendarMainFragment.JAVA
public class CalendarMainFragment extends Fragment implements View.OnClickListener {
public static final int MONTHS_LIMIT = 1200;
private ViewPager viewPager;
private final Utils utils = Utils.getInstance();
private int day;
private Calendar c = Calendar.getInstance();
private char[] digits;
private boolean clockIn24;
private Coordinate coord;
private TextView weekDayName;
private TextView miladiDate;
private TextView ghamariDate;
private TextView shamsiDate;
private TextView eventTitle;
private TextView today;
private CardView owghat;
private CardView event;
private View divider1;
private View divider2;
private View divider3;
private View divider4;
private View divider5;
private View divider6;
private View divider7;
@Nullable
@Override
public View onCreateView(
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_new_calendar, container, false);
divider1 = view.findViewById(R.id.div1);
divider2 = view.findViewById(R.id.div2);
divider3 = view.findViewById(R.id.div3);
divider4 = view.findViewById(R.id.div4);
divider5 = view.findViewById(R.id.div5);
divider6 = view.findViewById(R.id.div6);
divider7 = view.findViewById(R.id.div7);
miladiDate = (TextView) view.findViewById(R.id.miladi_date);
ghamariDate = (TextView) view.findViewById(R.id.ghamari_date);
weekDayName = (TextView) view.findViewById(R.id.week_day_name);
shamsiDate = (TextView) view.findViewById(R.id.shamsi_date);
miladiDate = (TextView) view.findViewById(R.id.miladi_date);
ghamariDate = (TextView) view.findViewById(R.id.ghamari_date);
today = (TextView) view.findViewById(R.id.today);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.RecyclerView);
azan1 = (TextView) view.findViewById(R.id.azan1);
azan2 = (TextView) view.findViewById(R.id.azan2);
azan3 = (TextView) view.findViewById(R.id.azan3);
azan4 = (TextView) view.findViewById(R.id.azan4);
azan5 = (TextView) view.findViewById(R.id.azan5);
aftab1 = (TextView) view.findViewById(R.id.aftab1);
aftab2 = (TextView) view.findViewById(R.id.aftab2);
aftab3 = (TextView) view.findViewById(R.id.aftab3);
eventTitle = (TextView) view.findViewById(R.id.event_title);
CardView infoDay = (CardView) view.findViewById(R.id.info_day);
owghat = (CardView) view.findViewById(R.id.owghat);
event = (CardView) view.findViewById(R.id.event);
viewPager = (ViewPager) view.findViewById(R.id.calendar_pager);
utils.loadHolidays(getResources().openRawResource(R.raw.holidays));
utils.loadLanguageFromSettings(getContext());
digits = utils.preferredDigits(getContext());
clockIn24 = utils.clockIn24(getContext());
coord = utils.getCoordinate(getContext());
ptc = new PrayTimesCalculator(utils.getCalculationMethod(getContext()));
viewPager.setAdapter(new CalendarAdapter(getActivity().getSupportFragmentManager()));
viewPager.setCurrentItem(MONTHS_LIMIT / 2);
infoDay.setOnClickListener(this);
owghat.setOnClickListener(this);
today.setOnClickListener(this);
return view;
}
public void changeMonth(int position) {
viewPager.setCurrentItem(viewPager.getCurrentItem() + position, true);
}
public void selectDay(PersianDate persianDate) {
CivilDate civilDate = DateConverter.persianToCivil(persianDate);
weekDayName.setText(utils.getWeekDayName(persianDate));
shamsiDate.setText(utils.dateToString(persianDate, digits));
miladiDate.setText(utils.dateToString(civilDate, digits));
ghamariDate.setText(utils.dateToString(DateConverter.civilToIslamic(civilDate), digits));
if (isToday(civilDate)) {
today.setVisibility(View.GONE);
} else {
today.setVisibility(View.VISIBLE);
}
setOwghat(civilDate);
showEvent(persianDate);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void addEventOnCalendar(PersianDate persianDate) {
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setData(CalendarContract.Events.CONTENT_URI);
CivilDate civil = DateConverter.persianToCivil(persianDate);
intent.putExtra(CalendarContract.Events.DESCRIPTION,
utils.dayTitleSummary(persianDate, digits));
Calendar time = Calendar.getInstance();
time.set(civil.getYear(), civil.getMonth() - 1, civil.getDayOfMonth());
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,
time.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
time.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
startActivity(intent);
}
private void showEvent(PersianDate persianDate) {
String holidayTitle = utils.getHolidayTitle(persianDate);
if (holidayTitle != null) {
eventTitle.setText(holidayTitle);
event.setVisibility(View.VISIBLE);
} else {
event.setVisibility(View.GONE);
}
}
private void setOwghat(CivilDate civilDate) {
if (coord == null) {
return;
}
c.set(civilDate.getYear(), civilDate.getMonth() - 1, civilDate.getDayOfMonth());
Date date = c.getTime();
Map<PrayTime, Clock> prayTimes = ptc.calculate(date, coord);
owghat.setVisibility(View.VISIBLE);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.info_day:
miladiDate.setVisibility(View.VISIBLE);
ghamariDate.setVisibility(View.VISIBLE);
break;
case R.id.owghat:
divider1.setVisibility(View.VISIBLE);
divider2.setVisibility(View.VISIBLE);
divider3.setVisibility(View.VISIBLE);
divider4.setVisibility(View.VISIBLE);
divider5.setVisibility(View.VISIBLE);
divider6.setVisibility(View.VISIBLE);
divider7.setVisibility(View.VISIBLE);
break;
case R.id.today:
bringTodayYearMonth();
break;
}
}
private void bringTodayYearMonth() {
if (viewPager.getCurrentItem() != MONTHS_LIMIT / 2) {
viewPager.setCurrentItem(MONTHS_LIMIT / 2);
}
selectDay(Utils.getToday());
}
private boolean isToday(CivilDate civilDate) {
CivilDate today = new CivilDate();
return today.getYear() == civilDate.getYear()
&& today.getMonth() == civilDate.getMonth()
&& today.getDayOfMonth() == civilDate.getDayOfMonth();
}
}
logcat的
04-18 21:21:50.244 16192-16192/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.playpersia.mycustomizedtoolbar, PID: 16192
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.playpersia.taghvimebastani.CalendarMainFragment.selectDay(com.playpersia.tag hvimebastani.PersianDate)' on a null object reference
at com.playpersia.taghvimebastani.MonthNewFragment.onClickItem(MonthNewFragment.java:98)
at com.playpersia.taghvimebastani.MonthAdapter$ViewHolder.onClick(MonthAdapter.java:58)
at android.view.View.performClick(View.java:4856)
at android.view.View$PerformClick.run(View.java:19956)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
答案 0 :(得分:1)
您的onclick方法不会测试calendarMainFragement是否为null。从堆栈看起来就像是它正在死去的地方。
at com.playpersia.taghvimebastani.MonthNewFragment.onClickItem(MonthNewFragment.java:98)
尝试在onClickItem处理程序上添加null测试。
public void onClickItem(PersianDate day) {
if (calendarMainFragment != null) {
calendarMainFragment.selectDay(day);
}
}
答案 1 :(得分:0)
View.OnClickListener是一个接口,所以如果你想使用它的引用那么你就有了实现类的传递引用 喜欢这样做
prev.setOnClickListener(MonthNewFragment.this); next.setOnClickListener(MonthNewFragment.this);