【问题标题】:How to show selected date in the dialog picker?如何在对话框选择器中显示选定的日期?
【发布时间】:2020-07-30 01:39:48
【问题描述】:

问题:日期选择器对话框不显示文本视图内的选定日期。它始终显示当前日期。

我尝试了什么:我尝试从 textview 获取日期,对其进行解析并尝试将其传递给对话框。我尝试的另一件事是使用捆绑包并传递我的日期。然后我尝试从捆绑包中获取该值,但它不起作用。它抛出一个空指针异常。

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

Detail Fragment 类(实现 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")
    
            }
        }
    }


 

DatePicker 片段类(创建 datePicker 对话框)

class DatePickerFragment : DialogFragment() {
    private lateinit var calender: Calendar
    private val dateFormat = SimpleDateFormat("EEEE MMM dd", Locale.US)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        calender = Calendar.getInstance()
    }


    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val bundle = Bundle()
        val selected: String? = bundle.getString("date")
        val date: Date? = dateFormat.parse(selected!!)
        calender.time = date!!
        val year = calender.get(Calendar.YEAR)
        val month = calender.get(Calendar.MONTH)
        val day = calender.get(Calendar.DAY_OF_MONTH)
        Log.i("datepick", "$month/$day/$year")
        val datepickerDiolog = DatePickerDialog(
            requireActivity(),
            parentFragment as OnDateSetListener?,
            year,
            month,
            day
        )
        datepickerDiolog.datePicker.minDate = System.currentTimeMillis() - 1000
        return datepickerDiolog
    }


}

【问题讨论】:

    标签: android kotlin datepickerdialog


    【解决方案1】:
    【解决方案2】:

    编辑* 我解决了这个问题。这就是我所做的。我从文本视图中获取日期并解析它。然后我将该日期分配到我的日历中。我使用了条件运算符,如果条件为真,则设置日期选择器对话框以显示 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多