MaterialDatePicker,选择结束日期后应用程序崩溃
Posted
技术标签:
【中文标题】MaterialDatePicker,选择结束日期后应用程序崩溃【英文标题】:MaterialDatePicker, app crashes after selecting the end date 【发布时间】:2021-05-05 13:56:10 【问题描述】:我有一个MaterialDatePicker
,它可以选择一系列数据,例如来自1 January 2021 to 31 January 2021
。
MaterialDatePicker.Builder<Pair<Long, Long>> builder = MaterialDatePicker.Builder.dateRangePicker();
CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder();
builder.setCalendarConstraints(constraintsBuilder.build());
int dialogTheme = resolveOrThrow(requireContext());
builder.setTheme(dialogTheme);
MaterialDatePicker<Pair<Long, Long>> picker = builder.build();
picker.show(requireActivity().getSupportFragmentManager(), picker.toString());
picker.addOnPositiveButtonClickListener(selection ->
long startDate = selection.first;
long endDate = selection.second;
from = DateFormat.format("yyyy-MM-dd", new Date(startDate)).toString();
to = DateFormat.format("yyyy-MM-dd", new Date(endDate)).toString();
);
private static int resolveOrThrow(Context context)
TypedValue typedValue = new TypedValue();
if (context.getTheme().resolveAttribute(R.attr.materialCalendarTheme, typedValue, true))
return typedValue.data;
throw new IllegalArgumentException(context.getResources().getResourceName(R.attr.materialCalendarTheme));
打开 MaterialDatePicker 时,它会显示当前日期 01 February 2021
。当我尝试从 2 月滚动到 1 月时,看不到该月的最后一天
要选择本月的最后一天,我应该向下滚动,但是当我选择本月的最后一天时,应用程序崩溃并显示此错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.view.View.getLeft()” 在 com.google.android.material.datepicker.MaterialCalendarGridView.horizontalMidPoint(MaterialCalendarGridView.java:242) 在 com.google.android.material.datepicker.MaterialCalendarGridView.onDraw(MaterialCalendarGridView.java:172) 在 android.view.View.draw(View.java:23915) 在 android.widget.AbsListView.draw(AbsListView.java:4988) 在 android.view.View.updateDisplayListIfDirty(View.java:22790) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java:5030) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.draw(View.java:23918) 在 androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java:4429) 在 android.view.View.updateDisplayListIfDirty(View.java:22790) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.updateDisplayListIfDirty(View.java:22776) 在 android.view.View.draw(View.java:23645) 在 android.view.ViewGroup.drawChild(ViewGroup.java:5336) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093) 在 android.view.View.draw(View.java:23918) 在 com.android.internal.policy.DecorView.draw(DecorView.java:1268) 在 android.view.View.updateDisplayListIfDirty(View.java:22790) 在 android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:567) 在 android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:573) 在 android.view.ThreadedRenderer.draw(ThreadedRenderer.java:650) 在 android.view.ViewRootImpl.draw(ViewRootImpl.java:4906) 在 android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4613) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3754) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2519) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9775) 2021-02-01 12:06:21.286 10369-10369/com.roko.hearth E/AndroidRuntime: 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010) 在 android.view.Choreographer.doCallbacks(Choreographer.java:809) 在 android.view.Choreographer.doFrame(Choreographer.java:744) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java:8425) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
我尝试查看MaterialCalendarGridView.java:242
,如错误所示,并且有这一行:
private static int horizontalMidPoint(@NonNull View view)
return view.getLeft() + view.getWidth() / 2;
有什么帮助吗?
【问题讨论】:
你用的是哪个版本? @GabrieleMariotticom.google.android.material:material:1.2.1
尝试在官方github repo中提交bug
@GabrieleMariotti 说实话,我什至在 Gradle 文件中都有这个:com.google.android.material:material:1.3.0-rc01
。我删除了,现在它可以正常工作了。谢谢你的回答。
@Erjon,因此当应用仅使用 com.google.android.material:material:1.3.0-rc01
时,Datapicker 可以正常工作?
【参考方案1】:
这是一个较晚的答案,但对其他人可能有用:崩溃已修复在 1.5.0-alpha01 版本的 android 材质组件上:https://github.com/material-components/material-components-android/releases/tag/1.5.0-alpha01(查看 MaterialDatePicker 部分)
因此您可以将材质组件升级到 1.5.0-alpha01+ 或解决方法是设置全屏主题
MaterialDatePicker.Builder.dateRangePicker()
.setTheme(R.style.ThemeOverlay_MaterialComponents_MaterialCalendar_Fullscreen)
.setCalendarConstraints(....)
.build()
【讨论】:
以上是关于MaterialDatePicker,选择结束日期后应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在MaterialDatePicker中打开之前选择的日期?
MaterialDatePicker 显示当前日期而不是需要