如何在 android 片段中正确实现接口?
How to properly implement an interface in android fragment?
伙计们。我一直在用 kotlin 做一个项目,我需要制作一个与父 activity 通信的片段......我完全按照 google 和其他网站的建议,但我仍然收到错误 "activity does not override anything"...所有其他解决方案都不适合我...这是代码。
片段
package com.me.assistan.assistant
import android.app.Activity
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import android.graphics.drawable.GradientDrawable
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.CompoundButton
import android.widget.LinearLayout
import android.widget.ToggleButton
import kotlinx.android.synthetic.main.content_newplan.*
import java.util.*
class addingTask : Fragment(), View.OnClickListener{
var func = Functions
var globalTask = GlobalTask
private lateinit var listener: OnTimeSettedListener
override fun onAttach(context: Context?) {
super.onAttach(context)
if (context is OnTimeSettedListener) {
listener = context
} else {
throw ClassCastException(context!!.toString() + " must implement
OnTimeSettedListener.")
}
}
companion object {
fun newInstance(): addingTask {
return addingTask()
}
}
override fun onCreateView(inflater: LayoutInflater?, container:
ViewGroup?,
savedInstanceState: Bundle?): View? {
val view: View = inflater!!.inflate(R.layout.fragment_adding_task,
container,
false)
val activity = activity
view.theTime.setOnClickListener { v ->
listener.onTimeSetListtedener("test")
}
return view
}
interface OnTimeSettedListener{
fun onTimeSetListtedener(comic : String){
println("ok")
}
}
}// Required empty public constructor
而不是 MAIN ACTIVITY
class Newplan : AppCompatActivity(), addingTask.OnTimeSettedListener {
var posx = 0f
private var startx = 0f
private var posy = 0f
private var starty = 0f
var backIntent = Intent();
var func = Functions
var globalTask = GlobalTask
val fragment = addingTask()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_newplan)
if(savedInstanceState === null){
var args = Bundle()
supportFragmentManager.beginTransaction()
.add(R.id.taskMain, addingTask.newInstance(),"newTask")
.commit()
}
}
override fun onTimeSettedListener(comic : String){
println("params")
}
}
我在 activity class 上收到错误...当我删除“覆盖?”时,错误消失了,但是当我单击按钮时没有任何反应...什么是我做错了吗?
正如@chris 评论的那样,您需要将下面的行移到 onCreate()
方法之外:
override fun onTimeSettedListener(comic: String) {
println("params")
}
您还需要匹配名称替换
interface OnTimeSettedListener {
fun onTimeSetListtedener(comic : String){
println("ok")
}
}
来自
interface OnTimeSettedListener {
fun onTimeSettedListener(comic: String) {
println("ok")
}
}
更新
如果您修复名称拼写错误并删除片段内界面中 onTimeSettedListener
声明的默认实现,因为您的 activity 实现了它并且 Android Studio 警告您缺少覆盖,可以单击它并且 select IDE 为您实现它以避免错误:
interface OnTimeSettedListener{
fun onTimeSettedListener(comic : String)
}
您还需要修复呼叫替换:
listener.onTimeSetListtedener("test")
来自
listener.onTimeSettedListener("test")
我认为您不应该将方法 body 添加到您的接口方法中。在 Java 中是不允许的。在 Kotlin 中,没有显示方法 body 受限的错误。但是你应该删除 body。更改您的界面,例如
interface OnTimeSettedListener{
fun onTimeSetListtedener(comic : String)
}
而且实际上你并没有覆盖你的监听器的方法。 OnTimeSettedListener
中的方法名称是 onTimeSetListtedener
,但您正在覆盖 onTimeSettedListener
,它实际上并不存在于您的代码中。
还有@albodelu提到的答案和@chris在评论中提到的,你不能在方法中写方法。这是不正确的用法。
伙计们。我一直在用 kotlin 做一个项目,我需要制作一个与父 activity 通信的片段......我完全按照 google 和其他网站的建议,但我仍然收到错误 "activity does not override anything"...所有其他解决方案都不适合我...这是代码。
片段
package com.me.assistan.assistant
import android.app.Activity
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import android.graphics.drawable.GradientDrawable
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.CompoundButton
import android.widget.LinearLayout
import android.widget.ToggleButton
import kotlinx.android.synthetic.main.content_newplan.*
import java.util.*
class addingTask : Fragment(), View.OnClickListener{
var func = Functions
var globalTask = GlobalTask
private lateinit var listener: OnTimeSettedListener
override fun onAttach(context: Context?) {
super.onAttach(context)
if (context is OnTimeSettedListener) {
listener = context
} else {
throw ClassCastException(context!!.toString() + " must implement
OnTimeSettedListener.")
}
}
companion object {
fun newInstance(): addingTask {
return addingTask()
}
}
override fun onCreateView(inflater: LayoutInflater?, container:
ViewGroup?,
savedInstanceState: Bundle?): View? {
val view: View = inflater!!.inflate(R.layout.fragment_adding_task,
container,
false)
val activity = activity
view.theTime.setOnClickListener { v ->
listener.onTimeSetListtedener("test")
}
return view
}
interface OnTimeSettedListener{
fun onTimeSetListtedener(comic : String){
println("ok")
}
}
}// Required empty public constructor
而不是 MAIN ACTIVITY
class Newplan : AppCompatActivity(), addingTask.OnTimeSettedListener {
var posx = 0f
private var startx = 0f
private var posy = 0f
private var starty = 0f
var backIntent = Intent();
var func = Functions
var globalTask = GlobalTask
val fragment = addingTask()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_newplan)
if(savedInstanceState === null){
var args = Bundle()
supportFragmentManager.beginTransaction()
.add(R.id.taskMain, addingTask.newInstance(),"newTask")
.commit()
}
}
override fun onTimeSettedListener(comic : String){
println("params")
}
}
我在 activity class 上收到错误...当我删除“覆盖?”时,错误消失了,但是当我单击按钮时没有任何反应...什么是我做错了吗?
正如@chris 评论的那样,您需要将下面的行移到 onCreate()
方法之外:
override fun onTimeSettedListener(comic: String) {
println("params")
}
您还需要匹配名称替换
interface OnTimeSettedListener {
fun onTimeSetListtedener(comic : String){
println("ok")
}
}
来自
interface OnTimeSettedListener {
fun onTimeSettedListener(comic: String) {
println("ok")
}
}
更新
如果您修复名称拼写错误并删除片段内界面中 onTimeSettedListener
声明的默认实现,因为您的 activity 实现了它并且 Android Studio 警告您缺少覆盖,可以单击它并且 select IDE 为您实现它以避免错误:
interface OnTimeSettedListener{
fun onTimeSettedListener(comic : String)
}
您还需要修复呼叫替换:
listener.onTimeSetListtedener("test")
来自
listener.onTimeSettedListener("test")
我认为您不应该将方法 body 添加到您的接口方法中。在 Java 中是不允许的。在 Kotlin 中,没有显示方法 body 受限的错误。但是你应该删除 body。更改您的界面,例如
interface OnTimeSettedListener{
fun onTimeSetListtedener(comic : String)
}
而且实际上你并没有覆盖你的监听器的方法。 OnTimeSettedListener
中的方法名称是 onTimeSetListtedener
,但您正在覆盖 onTimeSettedListener
,它实际上并不存在于您的代码中。
还有@albodelu提到的答案和@chris在评论中提到的,你不能在方法中写方法。这是不正确的用法。