You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android DatePicker Fragment空对象引用崩溃问题求助

Android DatePicker集成崩溃问题修复方案

问题描述

集成DatePicker时应用加载按钮崩溃,抛出空指针异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.getDecorView()' on a null object reference
                                        at androidx.activity.ComponentActivity.initializeViewTreeOwners(ComponentActivity.java:474)
                                        at androidx.activity.ComponentActivity.setContentView(ComponentActivity.java:438)
                                        at com.example.assignmentNotifier.ui.assignment.AssignmentEntryScreenKt.AssignmentInputForm(AssignmentEntryScreen.kt:152)
                                        at com.example.assignmentNotifier.ui.assignment.AssignmentEntryScreenKt.AssignmentEntryBody(AssignmentEntryScreen.kt:107)
                                        at com.example.assignmentNotifier.ui.assignment.AssignmentEntryScreenKt$AssignmentEntryScreen$2.invoke(AssignmentEntryScreen.kt:72)
                                        at com.example.assignmentNotifier.ui.assignment.AssignmentEntryScreenKt$AssignmentEntryScreen$2.invoke(AssignmentEntryScreen.kt:71)

问题根源

  • 错误调用setContentView:DialogFragment的onCreateDialog方法中无需调用setContentView,你引入的setContentView来自错误包路径,且此时DialogFragment未关联有效Window,触发空指针。
  • 视图加载方式不兼容:在Compose页面中使用findViewById不符合Compose的视图管理逻辑,两者体系不兼容。
  • 使用废弃API:android.app.DialogFragment是旧版API,存在兼容性问题,应改用AndroidX版本。

修复步骤

1. 重构DatePickerFragment

改用AndroidX的DialogFragment,移除无效布局加载代码,添加日期选择回调:

package com.example.assignmentNotifier

import android.app.DatePickerDialog
import android.app.Dialog
import android.os.Bundle
import android.widget.DatePicker
import androidx.fragment.app.DialogFragment
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale

class DatePickerFragment(private val onDateSelected: (String) -> Unit) : DialogFragment(), DatePickerDialog.OnDateSetListener {
    private val calendar = Calendar.getInstance()
    private val formatter = SimpleDateFormat("MMM. dd, yyyy", Locale.US)

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val year = calendar.get(Calendar.YEAR)
        val month = calendar.get(Calendar.MONTH)
        val day = calendar.get(Calendar.DAY_OF_MONTH)

        // 使用系统默认的DatePickerDialog,无需自定义布局
        return DatePickerDialog(requireContext(), this, year, month, day)
    }

    override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
        calendar.set(year, month, day)
        val formattedDate = formatter.format(calendar.time)
        onDateSelected(formattedDate)
    }
}

2. 修复Compose页面的按钮逻辑

用Compose原生Button组件替代findViewById,通过supportFragmentManager显示对话框:

// 在AssignmentEntryScreen的Compose代码块中
var selectedDate by remember { mutableStateOf<String?>(null) }
val context = LocalContext.current
val fragmentManager = (context as AppCompatActivity).supportFragmentManager

Button(onClick = {
    DatePickerFragment { date ->
        selectedDate = date
    }.show(fragmentManager, "datePicker")
}) {
    Text(text = selectedDate ?: "Pick date")
}

3. 清理无用资源

删除datepicker.xml布局文件,因为我们直接使用系统默认的DatePickerDialog,无需自定义布局。

内容的提问来源于stack exchange,提问作者Joshua Luscher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:46:23