安卓 Kotlin DialogFragment(时间选择器)

4
我是一名有用的助手,可以为您翻译文本。
我在使用 Kotlin 和 Android 显示 DialogFragment 时遇到了问题。这是我目前的代码: TimePickerFragment.kt
package de.flokol120.UniversalSleepTimer

import android.app.Dialog
import android.app.DialogFragment
import android.widget.TimePicker
import android.app.TimePickerDialog
import android.os.Bundle
import android.text.format.DateFormat
import java.util.*


/**
 * @author flokol120
 * TimePicker Fragment to get the time
 */
class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR_OF_DAY)
        val minute = c.get(Calendar.MINUTE)

        return TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()))
    }

    override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {
        //TODO add this
    }
}

还有 AddTimer.kt

package de.flokol120.UniversalSleepTimer

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button


/**
 * @author flokol120
 * the fragment which adds a simple kill Timer
 */
class AddTimer : Fragment() {

    lateinit var timePicker : Button

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val v = inflater!!.inflate(R.layout.fragment_add_timer, container, false)

        timePicker = v.findViewById(R.id.timePicker)

        timePicker.setOnClickListener {
            val newFragment = TimePickerFragment()
            newFragment.show(fragmentManager, "timePicker")
        }

        return v
    }

}

我还尝试用 this@AddTimer.fragmentManager 替换了 fragmentManager,但这似乎不是解决方案。

现在我感到非常困惑,因为Android Studio说我必须使用 FragmentManager! 作为第一个参数,但我已经在使用一个了,对吧?

4个回答

11

Aliaksandr Kavalenka提出了一个巧妙的解决方法,适用于日期选择器。我按照他的想法进行了修改,以适应时间选择器:

fun getTime(textView: TextView, context: Context){

    val cal = Calendar.getInstance()

    val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute ->
        cal.set(Calendar.HOUR_OF_DAY, hour)
        cal.set(Calendar.MINUTE, minute)

        textView.text = SimpleDateFormat("HH:mm").format(cal.time)
    }

    textView.setOnClickListener {
        TimePickerDialog(context, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show()
    }
}

4
也许这会对你有所帮助。
我有一个名为 getDate() 的函数。
fun getDate(textView: TextView, context: Context){

        val cal = Calendar.getInstance()

        val dateSetListener = DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
            cal.set(Calendar.YEAR, year)
            cal.set(Calendar.MONTH, monthOfYear)
            cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)

            textView.text = SimpleDateFormat("dd.MM.yyyy").format(cal.time)

        }

        textView.setOnClickListener {
            DatePickerDialog(context, dateSetListener,
                    cal.get(Calendar.YEAR),
                    cal.get(Calendar.MONTH),
                    cal.get(Calendar.DAY_OF_MONTH)).show()
        }
    }

如果一个Activity需要调用DatePickerDialog - 我只需使用我的函数。
presenter.getDate(textViewTime, this)

Presenter - 它是一个对象,其中包含我的函数getDate。


谢谢你的回答。但是我想要一个时间选择器,而不是日期选择器。不过也有一个TimePickerDialog,我可以使用它,谢谢! - flokol120

0
 private var date: DatePickerDialog.OnDateSetListener? = null

 date = DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->

            myCalendar?.set(Calendar.YEAR, year)
            myCalendar?.set(Calendar.MONTH, monthOfYear)
            myCalendar?.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            val myFormat = "yyyy-MM-dd"
            val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
            Log.d("date_of_birth", sdf.format(myCalendar?.time))

        }

0

看起来你正在将常规的DialogFragment与支持库Fragment混合使用。你应该扩展“android.support.v4.app.DialogFragment”,而不是“import android.app.DialogFragment”。

支持库使用支持库版本的FragmentManager,而不是常规的FragmentManager。

希望这可以帮到你。


谢谢!错误已经消失了,但是newFragment.show(this@AddTimer.fragmentManager, "timePicker")newFragment.show(fragmentManager, "timePicker")都会产生一个java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState。有什么想法吗? - flokol120

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接