【问题标题】:How to prevent dismiss of Time Picker Dialog after time selection?如何防止在时间选择后关闭时间选择器对话框?
【发布时间】:2021-12-21 09:58:22
【问题描述】:

我正在使用android的TimePickerDialog这种方式

val tpd = TimePickerDialog(this, { dialog, h, min -> 
 // I want to dismiss the dialog only if the validations succeed
}, 12, 15, false)
tpd.show()

如何防止它在用户选择时间后自动关闭?我想在关闭时间选择器对话框之前运行验证。

【问题讨论】:

    标签: android android-timepicker


    【解决方案1】:

    由于TimePickerDialog 扩展了AlertDialog,您可以获取正按钮并修改其点击监听器This way

    但这里的问题是您将无法访问TimePicker 小部件,因为您需要它来获得验证时间。因为如果您覆盖肯定按钮单击,您的侦听器将不会被调用,并且 mTimePicker 字段在 TimePickerDialog 中是私有的。当然你可以通过反射来访问它,但这不是正确的做法。

    作为解决方案,创建一个自定义 AlertDialog 。这样您就可以控制选择。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TimePicker
        android:id="@+id/TimePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    </LinearLayout>
    
    
     val alert = AlertDialog.Builder(this)
            alert.setView(R.layout.time_picker)
            alert.setPositiveButton("OK"
            ) { dialog, which -> {
                    // validate here
            } }
    
            alert.setNegativeButton("Cancel"
            ) { dialog, which -> {
                dialog.dismiss()
            } }
            alert.show()
    

    使用This Approach 防止AlertDialog 被关闭,您就可以开始了。

    【讨论】:

      【解决方案2】:
      abstract class TimePickerDialog2(
          context: Context,
          hourOfDay: Int, minute: Int, is24Hour: Boolean
      ) {
          private val impl = DialogImpl(context, { view, hourOfDay, minute ->
              if (onTimeSet(view, hourOfDay, minute)) {
                  dismiss()
              }
          }, hourOfDay, minute, is24Hour)
      
          fun show() { impl.show() }
          fun dismiss() { impl.dismiss() }
      
          /** Called when user presses OK button. Return [true] to close dialog, [false] otherwise. */
          abstract fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int)
                  : Boolean
      
          private class DialogImpl(
              context: Context,
              listener: OnTimeSetListener,
              hourOfDay: Int, minute: Int, is24Hour: Boolean
          ) : TimePickerDialog(context, listener, hourOfDay, minute, is24Hour) {
      
              var skipDismiss = false
              override fun dismiss() { if (skipDismiss) { skipDismiss = false } else { super.dismiss() } }
              override fun onClick(dialog: DialogInterface, which: Int) {
                  super.onClick(dialog, which)
                  skipDismiss = (which == BUTTON_POSITIVE)
              }
          }
      }
      

      用法

      object : TimePickerDialog2(this, 12, 15, false) {
          override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int): Boolean {
              if (/* the validations succeed */) {
                  return true
              }
              return false
          }
      }.show()
      

      此实现使用一些 hacky 技巧来解决问题。最好使用自定义AlertDialog 解决方案,正如上面@ADM 所建议的那样。

      【讨论】:

        猜你喜欢
        • 2014-06-17
        • 2015-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        相关资源
        最近更新 更多