如何在Android片段中正确实现一个接口?

乡亲。 我一直在与kotlin一个项目工作,我需要做一个片段,与父母的活动交流…我完全按照谷歌和其他网站的建议,但我仍然得到一个错误“活动不会覆盖任何东西”…所有其他解决方案都不适合我…这里是代码。

分段

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 

而不是主要活动

 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") } } 

我得到的活动类错误…当我删除“重写?,错误消失,但没有发生,当我点击按钮…我做错了什么?

我认为你不应该添加方法体到你的接口方法。 在Java中是不允许的。 在Kotlin没有显示方法体被限制的错误。 但你应该删除身体。 改变你的界面

 interface OnTimeSettedListener{ fun onTimeSetListtedener(comic : String) } 

实际上,你并不是凌驾于Listener的方法上。 OnTimeSettedListener方法名是onTimeSetListtedener但是你重写了onTimeSettedListener ,而这个代码并不存在。

另外@albodelu提到的答案和@chris在评论中提到,你不能在方法中写入方法。 这是不正确的用法。

正如@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声明的默认实现,那么当您的活动实现它并且Android Studio警告您缺少重写时,可以单击它并选择IDE实现它你要避免错误:

 interface OnTimeSettedListener{ fun onTimeSettedListener(comic : String) } 

您还需要更换电话:

 listener.onTimeSetListtedener("test") 

通过

 listener.onTimeSettedListener("test")