android - 如何在android fragment 中正确实现接口(interface)?

标签 android android-studio android-fragments kotlin kotlin-android-extensions

伙计们。我一直在使用 kotlin 进行一个项目,我需要制作一个与父 Activity 进行通信的 fragment ......我完全按照谷歌和其他网站的建议进行操作,但我仍然收到错误“Activity 不会覆盖任何东西”......所有其他解决方案都不适合我...这是代码。

fragment

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

而不是主要 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 类上收到错误...当我删除“覆盖?”时,错误消失了,但当我单击按钮时没有任何反应...我做错了什么?

最佳答案

我认为你不应该将方法体添加到你的接口(interface)方法中。这在 Java 中是不允许的。在 Kotlin 中,没有限制显示方法体的错误。但是你应该删除 body 。像这样更改您的界面

interface OnTimeSettedListener{
    fun onTimeSetListtedener(comic : String)
}

而且实际上你并没有覆盖你的监听器的方法。 OnTimeSettedListener 中的方法名称是 onTimeSetListtedener,但您正在覆盖 onTimeSettedListener,它实际上并不存在于您的代码中。

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

关于android - 如何在android fragment 中正确实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178755/

相关文章:

android-studio - 无法解析:com.google.android.gms:播放服务游戏:6.5+

android - 从自定义 ListView 适配器调用 Fragment 类中的 onItemClick

java - 如何恢复 Fragment 中 AdapterViewFlipper 的状态?

android - Android 上 libjpeg-turbo 的集成或构建说明

java - 在 Android 应用程序的改造实现中访问 kotlin 类自动生成的 getter 方法

android - 从浏览器 : ERR_UNKNOWN_URL_SCHEME 通过 Whatsapp 分享

android - Android-Studio错误:链接引用失败

android - 使用对当前未显示的 Activity 的引用来启动另一个 Activity

android - 棉花糖权限应该仅在尚未授予时询问

android - 如何在 Android 中从 Activity 移动到 Fragment?