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

标签 java android calendar onclick android-logcat

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

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

相关文章:

java - 将字段移至局部变量的好处

Android 有意打开任何日历应用程序(4.2.2 及更高版本)

java - 如何从某一点向前设置文本颜色

安卓通知 : make ticker text stay longer

Android ViewHolder 和类广播异常

events - 使用 Microsoft graph 创建事件时出错

iphone - 如何将日期中的年份更改为当前年份?

java - 仅生成一次随机数

java - Eclipselink 缓存 - 在事务中保留相同的对象

java - java代码是否自动利用多个处理器内核(如果可用)