gpt4 book ai didi

java - 致命异常 : java. lang.NullPointerException:尝试在空对象引用 onClickItem 上调用虚拟方法 void

转载 作者:行者123 更新时间:2023-12-01 10:02:20 25 4
gpt4 key购买 nike

我正在制作日历,但是当我点击日历日时,它崩溃了。我检查了代码好几次,但它总是崩溃。

我将发布相关代码和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)

最佳答案

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

关于java - 致命异常 : java. lang.NullPointerException:尝试在空对象引用 onClickItem 上调用虚拟方法 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36700493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com