Android 如何在对话框选择器中显示所选日期?
问题:Datepicker对话框未显示textview中的选定日期。它总是显示当前日期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
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()