无效的回历月日:31

问题描述

我尝试创建一个带有按钮和显示日期的文本视图的简单活动。单击该按钮时,应显示 HijriDatePicker 对话框。我尝试使用 ummalqura-calendar 制作它,并通过对话框尝试使用 HijriDatePicker 创建对话框。

然而,经过多次尝试,它不起作用。有时当我单击按钮时活动会停止,有时它会崩溃。我已经尝试了很多失败的尝试。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication,PID: 13658
    com.github.msarhan.ummalqura.calendar.DateTimeException: Invalid Hijrah day of month: 31
        at com.github.msarhan.ummalqura.calendar.HijrahChronology.getEpochDay(HijrahChronology.java:255)
        at com.github.msarhan.ummalqura.calendar.HijrahChronology.toGregorian(HijrahChronology.java:697)
        at com.github.msarhan.ummalqura.calendar.UmmalquraCalendar.set(UmmalquraCalendar.java:259)
        at net.alhazmy13.hijridatepicker.date.hijri.HijriDatePickerDialog.getEndDate(HijriDatePickerDialog.java:1028)
        at net.alhazmy13.hijridatepicker.date.hijri.MonthAdapter.getCount(MonthAdapter.java:146)
        at android.widget.ListView.setAdapter(ListView.java:493)
        at net.alhazmy13.hijridatepicker.date.hijri.DayPickerView.refreshAdapter(DayPickerView.java:142)
        at net.alhazmy13.hijridatepicker.date.hijri.DayPickerView.setController(DayPickerView.java:114)
        at net.alhazmy13.hijridatepicker.date.hijri.DayPickerView.<init>(DayPickerView.java:105)
        at net.alhazmy13.hijridatepicker.date.hijri.SimpleDayPickerView.<init>(SimpleDayPickerView.java:32)
        at net.alhazmy13.hijridatepicker.date.hijri.HijriDatePickerDialog.onCreateView(HijriDatePickerDialog.java:340)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.movetoState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.movetoState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

和我的主要活动 java

public class MainActivity extends AppCompatActivity implements HijriDatePickerDialog.OnDateSetListener{
    TextView tvDate;
    TextView etDate;
    HijriDatePickerDialog.OnDateSetListener setListener;

    public MainActivity() {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvDate = findViewById(R.id.tv_date);
        etDate = findViewById(R.id.et_date);


        tvDate.setonClickListener(v -> {
            UmmalquraCalendar Now = new UmmalquraCalendar();
            HijriDatePickerDialog dpd = HijriDatePickerDialog.newInstance(
                    MainActivity.this,Now.get(Calendar.YEAR),Now.get(Calendar.MONTH),Now.get(Calendar.DAY_OF_MONTH)
            );
            dpd.setMinDate(new UmmalquraCalendar(1440,1));
            dpd.show(getSupportFragmentManager(),"Datepickerdialog");
        });

    }

    @Override
    public void onResume() {
        super.onResume();
        assert getFragmentManager() != null;
        HijriDatePickerDialog dpd = (HijriDatePickerDialog) getSupportFragmentManager().findFragmentByTag("Datepickerdialog");
        if (dpd != null) dpd.setonDateSetListener(this);
    }

    @Override
    public void onDateSet(HijriDatePickerDialog view,int year,int monthOfYear,int dayOfMonth) {
        String date = "You picked the following date: " + dayOfMonth + "/" + (++monthOfYear) + "/" + year;
        System.out.println(date);
        etDate.setText(date);
    }
}

解决方法

这个问题似乎是 msarhan-library 中的一个已知错误。其相关网站上还有一个同时关闭的issue。它表示已在最新版本中应用了修复。

所以我建议您将您的 marhan 库更新到 v2.0.2 版本,这可能会解决您的问题。

更新:

查看您使用的日期选择器库时,我们可以看到它仍然使用 version v2.0.1。要么等到 date-picker-library 的作者修复依赖项,要么构建自己的 date-picker-library 版本。