Android 如何在对话框选择器中显示所选日期?

Android 如何在对话框选择器中显示所选日期?,android,kotlin,datepickerdialog,Android,Kotlin,Datepickerdialog,问题:Datepicker对话框未显示textview中的选定日期。它总是显示当前日期 private fun showDialog() { val calender: Calendar = Calendar.getInstance() try { if (tvCalender.text != null) { val date: Date? = dateFormatter.parse(tvCalender.t

问题:Datepicker对话框未显示textview中的选定日期。它总是显示当前日期

private fun showDialog() {
        val calender: Calendar = Calendar.getInstance()
        try {
            if (tvCalender.text != null) {
                val date: Date? = dateFormatter.parse(tvCalender.text.toString())
                Log.d("parse", "$date")
                calender.time = date ?: now.time

                Log.d("cal", "${calender.time}")

            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        //   val calender = Calendar.getInstance()
        val year = calender.get(Calendar.YEAR)
        val month = calender.get(Calendar.MONTH)
        val day = calender.get(Calendar.DAY_OF_MONTH)
     

        val datePickerDialog = DatePickerDialog(requireContext(), this, year, month, day)
        datePickerDialog.datePicker.minDate = System.currentTimeMillis() - 1000
        datePickerDialog.show()
我尝试的是:我尝试从textview获取日期,解析它并尝试将其传递给对话框。我尝试的另一件事是用一个包裹传递我的约会对象。然后我尝试从bundle中获取该值,但它不起作用。它抛出空指针异常

我期望的是:如果textview为空,则显示当前日期,否则显示textview内的选定日期

细节片段类(实现onDatesetListener


    class DetailFragment : Fragment(), TimePickerDialog.OnTimeSetListener,
        DatePickerDialog.OnDateSetListener {
        private val args by navArgs<DetailFragmentArgs>()
        private var notificationOnOrOff = false
        private var c: Calendar = Calendar.getInstance()
        private var _binding: FragmentDetailBinding? = null
        private val binding
            get() = _binding!!
        private val reminderchannelID = "reminder_channel_id"
        val reminderChannel: String = "reminderChannel"
        private val request_ID = 2
        var hour_ofDay: Int = 0
        var minute_ofDay: Int = 0
        private lateinit var spinner: Spinner
        lateinit var now : Calendar
        private val timeFormat = SimpleDateFormat("hh:mm a", Locale.US)
        private val dateFormat = SimpleDateFormat("EEEE MMM dd", Locale.US)
        private lateinit var notificationManager: NotificationManager
        lateinit var notificationChannel: NotificationChannel
    
        // private val dateFormat = SimpleDateFormat("EEEE MMM dd", Locale.US)
        private lateinit var todoViewModel: TodoViewModel
        private lateinit var detailArgs: DetailFragmentArgs
        private lateinit var calender: TextView
        private lateinit var timePicker: TextView
        private lateinit var detailViewModel: DetailViewModel
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            _binding = FragmentDetailBinding.inflate(inflater, container, false)
            todoViewModel = ViewModelProvider(this).get(TodoViewModel::class.java)
            detailViewModel = ViewModelProvider(this).get(DetailViewModel::class.java)
            observeCalenderPicker()
            observeTimePicker()
            calender = binding.tvCalender
            now = Calendar.getInstance()
            timePicker = binding.tvTimePicker
            calender.setOnClickListener {
                DatePickerFragment().show(childFragmentManager, "Date Picker")
            }
            timePicker.setOnClickListener {
                TimePickerFragment().show(childFragmentManager, "Time Picker")
            }
            binding.btnNotificationStatus.setOnCheckedChangeListener { view, ischeck ->
                updateNotificationStatus(ischeck)
            }
    
            return binding.root
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    
        override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
            inflater.inflate(R.menu.add_item, menu)
            super.onCreateOptionsMenu(menu, inflater)
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setHasOptionsMenu(true)
        }
    
        override fun onOptionsItemSelected(item: MenuItem): Boolean {
            val title = edtTaskName.text.toString()
            when (item.itemId) {
                R.id.add_item -> {
                    saveTodoItem()
                    hideVirtualKeyboard()
                    // cancelAlarm()
                    return true
                }
            }
            return super.onOptionsItemSelected(item)
        }
    
        private fun saveTodoItem() {
            if (arguments != null) {
                val name = binding.edtTaskName.text.toString()
                val dueDate = calender.text.toString()
                val dueTime = timePicker.text.toString()
                val notificationStatus = btnNotificationStatus.isChecked
                val item =
                    args.item?.id?.let { TodoItem(it, name, dueDate, dueTime, notificationStatus) }
                if (item != null) {
                    todoViewModel.updateItem(item)
                    Log.i("updated_item", "$item")
                    Toast.makeText(requireContext(), "Item is updated", Toast.LENGTH_SHORT).show()
                    findNavController().navigate(R.id.action_detailFragment_to_mainFragment)
                } else {
                    val taskName = binding.edtTaskName.text.toString()
                    val due = calender.text.toString()
                    val time = timePicker.text.toString()
                    val statusOfNotification = binding.btnNotificationStatus.isChecked
    
                    if (name.isBlank()) {
                        Toast.makeText(requireContext(), "Empty task field", Toast.LENGTH_SHORT).show()
                        return
                    }
                    val toDOItem = TodoItem(0, taskName, due, time, statusOfNotification)
                    todoViewModel.insertItem(toDOItem)
                    Log.i("item_inserted", "Item is inserted $toDOItem ")
                    findNavController().navigate(R.id.action_detailFragment_to_mainFragment)
                    Toast.makeText(requireContext(), "Task added successfully", Toast.LENGTH_SHORT)
                        .show()
                }
            }
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            getArgs()
            observeNotificationStatus()
        }
        private fun getArgs() {
            if (arguments != null) {
                detailArgs = DetailFragmentArgs.fromBundle(requireArguments())
                binding.edtTaskName.setText(detailArgs.item?.title)
                calender.text = detailArgs.item?.dueDate
                timePicker.text = detailArgs.item?.dueTime
                binding.btnNotificationStatus.isChecked = detailArgs.item?.notificationOnOrOff ?: false
    
                Log.i("binding", "${binding.btnNotificationStatus.isChecked}")
            }
        }
    
        override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
            val bundle = Bundle()
            val calender = Calendar.getInstance()
            calender.set(Calendar.YEAR, year)
            calender.set(Calendar.MONTH, month)
            calender.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            val date: String = dateFormat.format(calender.time)
            Log.i("date", "${calender.time}")
            // val selectedDate = dateFormat.parse(tvCalender.text.toString())
            bundle.putString("date",date)
            detailViewModel.setDateCalenderValue(date)
            Toast.makeText(requireContext(), "Date has been chosen", Toast.LENGTH_SHORT).show()
        }
        override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
            //val calendar = Calendar.getInstance()
            cal.set(Calendar.HOUR, hourOfDay)
            cal.set(Calendar.MINUTE, minute)
            cal.set(Calendar.SECOND, 0)
            val time = timeFormat.format(cal.timeInMillis)
            detailViewModel.setTimePickerValue(time)
            //  updateNotificationStatus(cal)
        }
    
        companion object {
            val cal: Calendar = Calendar.getInstance()
        }
    
        private fun setAlarm(calendar: Calendar) {
            val alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(requireContext(), NotificationReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(requireContext(), request_ID, intent, 0)
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.timeInMillis, pendingIntent)
        }
    
        private fun cancelAlarm() {
            val alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(requireContext(), NotificationReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(requireContext(), request_ID, intent, 0)
            alarmManager.cancel(pendingIntent)
        }
    
        private fun observeCalenderPicker() {
            detailViewModel.date.observe(viewLifecycleOwner, androidx.lifecycle.Observer { date ->
                calender.text = date
                Log.i("date_picker", "$date")
            })
        }
    
        private fun observeTimePicker() {
            detailViewModel.time.observe(viewLifecycleOwner, androidx.lifecycle.Observer { time ->
                timePicker.text = time
                Log.i("time_picker", "$time")
    
            })
        }
    
        fun observeCalenderText() {
            detailViewModel.time.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
    
            })
        }
        private fun observeNotificationStatus() {
            detailViewModel.status.observe(
                viewLifecycleOwner,
                androidx.lifecycle.Observer { status: Boolean ->
                    binding.btnNotificationStatus.isChecked = status
                    Log.i("log_check", "$status")
    
                })
        }
    
        private fun updateNotificationStatus(status: Boolean) {
            detailViewModel.setNotificationStatus(status)
            if (status) {
                setAlarm(cal)
                Toast.makeText(
                    requireContext(),
                    "Alarm is set for ${timeFormat.format(cal.time)}",
                    Toast.LENGTH_SHORT
                ).show()
                Log.i("alarm_set", "${timeFormat.format(cal.time)}")
            } else {
                cancelAlarm()
                Toast.makeText(requireContext(), "Alarm is cancel ", Toast.LENGTH_SHORT).show()
                Log.i("alarm_cancel", "$status")
    
            }
    
        }
    
        private fun hideVirtualKeyboard() {
            try {
                val imm =
                    requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                imm.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, 0)
            } catch (e: Exception) {
                e.printStackTrace()
            }
    
        }
    
        private fun update() {
            val status = binding.btnNotificationStatus.isChecked
            detailViewModel.setNotificationStatus(status)
            if (status) {
                setAlarm(cal)
                Toast.makeText(
                    requireContext(),
                    "Alarm is set for ${timeFormat.format(cal.time)}",
                    Toast.LENGTH_SHORT
                ).show()
                Log.i("alarm_set", "${timeFormat.format(cal.time)}")
            } else {
                cancelAlarm()
                Toast.makeText(requireContext(), "Alarm is cancel ", Toast.LENGTH_SHORT).show()
                Log.i("alarm_cancel", "$status")
    
            }
        }
    }


 


与其他片段通信url:

与其他片段通信url:

编辑*我修复了问题。我所做的就是这样。我从textview中获取日期并对其进行解析。然后我将该日期分配到我的日历中。我使用条件运算符,如果条件为true,则设置日期选择器对话框以显示textview日期,如果如果条件为false,请将“日期选择器”对话框设置为显示当前日期

private fun showDialog() {
        val calender: Calendar = Calendar.getInstance()
        try {
            if (tvCalender.text != null) {
                val date: Date? = dateFormatter.parse(tvCalender.text.toString())
                Log.d("parse", "$date")
                calender.time = date ?: now.time

                Log.d("cal", "${calender.time}")

            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        //   val calender = Calendar.getInstance()
        val year = calender.get(Calendar.YEAR)
        val month = calender.get(Calendar.MONTH)
        val day = calender.get(Calendar.DAY_OF_MONTH)
     

        val datePickerDialog = DatePickerDialog(requireContext(), this, year, month, day)
        datePickerDialog.datePicker.minDate = System.currentTimeMillis() - 1000
        datePickerDialog.show()

编辑*我解决了这个问题。以下是我所做的。我从textview中获取日期并对其进行解析。然后我将该日期分配到日历中。我使用条件运算符,如果条件为真,则设置日期选择器对话框以显示textview日期,如果条件为假,则设置日期选择器对话框以显示当前日期

private fun showDialog() {
        val calender: Calendar = Calendar.getInstance()
        try {
            if (tvCalender.text != null) {
                val date: Date? = dateFormatter.parse(tvCalender.text.toString())
                Log.d("parse", "$date")
                calender.time = date ?: now.time

                Log.d("cal", "${calender.time}")

            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        //   val calender = Calendar.getInstance()
        val year = calender.get(Calendar.YEAR)
        val month = calender.get(Calendar.MONTH)
        val day = calender.get(Calendar.DAY_OF_MONTH)
     

        val datePickerDialog = DatePickerDialog(requireContext(), this, year, month, day)
        datePickerDialog.datePicker.minDate = System.currentTimeMillis() - 1000
        datePickerDialog.show()