class - Kotlin 问题:类中的 TimePickerDialog.OnTimeSetListener(输出:2 个值 Long&String)
问题描述
3 个月后,我仍然没有找到解决方案,我需要你的帮助。
语言:Kotlin(Android Studio 3.3.2 Build #AI-182.5107.16.33.5314842,于 2019 年 2 月 16 日构建 JRE:1.8.0_152-release-1248-b01 amd64 JVM:JetBrains sro Windows 10 的 OpenJDK 64 位服务器 VM 10.0)
目标/目标:类中的 TimePickerDialog.OnTimeSetListener(输出:2 个值 Long&String)
问题:我无法真正描述问题,我只有这个 Kotlin 错误消息。上下文:this --> 类型不匹配。要求:上下文!找到:我的班级
我的代码:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:text="@string/textview"
android:layout_width="125dp"
android:layout_height="58dp"
android:id="@+id/textView" android:layout_marginTop="60dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="40dp"/>
<Button
android:text="@string/button"
android:layout_width="113dp"
android:layout_height="58dp"
android:id="@+id/button" android:layout_marginTop="60dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView"
android:layout_marginStart="56dp"/>
</android.support.constraint.ConstraintLayout>
MainActivity.kt
package com.terminal_io.goodapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var myOutput = MyClass (31415926535, "Test")
button.setOnClickListener()
{
myOutput.myTime()
textView.text = myOutput.myStringInfo
}
}
}
Kotlin 类
package com.terminal_io.goodapp
import android.app.TimePickerDialog
import java.sql.Time
import java.text.SimpleDateFormat
import java.util.*
class MyClass (LongInfo: Long, StringInfo : String)
{
var myLongInfo = LongInfo
var myStringInfo = StringInfo
fun myTime() : Long
{
var cal = Calendar.getInstance()
var timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker,
hour, minute ->
cal.set(Calendar.HOUR_OF_DAY, hour)
cal.set(Calendar.MINUTE, minute)
myStringInfo = SimpleDateFormat("HH:mm").format(cal.time)
}
var Hour = Calendar.HOUR_OF_DAY.toLong()
var Minute = Calendar.MINUTE.toLong()
var h: Long = Hour * 3600000 // Hour in millisecs
var m: Long = Minute * 60000 // Minute in millisecs
myLongInfo = h + m
TimePickerDialog(this, timeSetListener, // ??? --> context: this -->
// Type mismatch. Required: Context! Found: MyClass
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
true
).show()
return myLongInfo; myStringInfo // ??? -> myStringInfo --> Unreachable
// code
}
}
解决方案
据我了解,您有一些以毫秒为单位的时间,您希望将其转换为时间(31415926535
等于 15:38)并在时间选择器中设置此时间。
你可以在你的活动中做所有事情(在一堂课中):
package training.com.myapplication
import android.app.TimePickerDialog
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val time = 31415926535 // It is: 15:38
setTimeListener(time)
}
private fun setTimeListener(time: Long) {
// Get instance of calendar
val calendar = Calendar.getInstance()
// Set time (from milliseconds)
calendar.timeInMillis = time
// Create dialog and set hours, minutes and 24 hours mode
val dialog = TimePickerDialog(
this,
getTimePickerListener(),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
true
)
// After button click - open dialog
button.setOnClickListener {
dialog.show()
}
}
private fun getTimePickerListener() =
TimePickerDialog.OnTimeSetListener { _, hourOfDay, minute ->
// After selecting time - set text in TextView
textView.text = "%02d:%02d".format(hourOfDay, minute)
}
}
您还可以将部分代码移动到单独的类
package training.com.myapplication
import android.app.TimePickerDialog
import android.content.Context
import java.util.*
class MyOwnClass(
private val context: Context,
private val timePickerListener: TimePickerDialog.OnTimeSetListener
) {
fun showTimeDialog(time: Long) {
// Get instance of calendar
val calendar = Calendar.getInstance()
// Set time (from milliseconds)
calendar.timeInMillis = time
// Create dialog and set hours, minutes and 24 hours mode
TimePickerDialog(
context,
timePickerListener,
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
true
).show()
}
}
并调用您的活动(通过context
,listener
和time
)
package training.com.myapplication
import android.app.TimePickerDialog
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val time = 31415926535 // It is: 15:38
val dialog = MyOwnClass(this, getTimePickerListener())
// After button click - open dialog
button.setOnClickListener {
dialog.showTimeDialog(time)
}
}
private fun getTimePickerListener() =
TimePickerDialog.OnTimeSetListener { _, hourOfDay, minute ->
// After selecting time - set text in TextView
textView.text = "%02d:%02d".format(hourOfDay, minute)
}
}
推荐阅读
- dart - 我们可以使用 Flutter 或 Dart 制作 Web 应用程序或网站吗
- docker - 用于 tomcat 7.0.55 的 Docker 映像
- javascript - 将 sencha 应用程序与后端 Java 服务器分开,以获得更好的工作环境
- codeigniter - 提交表单,它显示“column_name 不能为空”,但在表单内部,该值不为空。(代码点火器)
- c# - 将 DataTable 与 ListBox 绑定
- java - 从带有文件数组的 React 应用程序发送 POST 请求,在 Spring API 中作为字符串数组接收
- angular - Angular Universal:如何创建应用程序外壳并仅预渲染外壳?
- encoding - 这种编码类型的文本是什么?
- java - org.opencv.core.CvException: cv::Exception
- git-flow - 无法克隆 Gitflow