【问题标题】:How to properly implement an interface in android fragment?如何在android片段中正确实现接口?
【发布时间】:2018-01-10 00:43:08
【问题描述】:

伙计们。我一直在使用 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")
}
}

我在活动类上收到错误...当我删除“覆盖?”时,错误消失了,但是当我单击按钮时没有任何反应...我做错了什么?

【问题讨论】:

  • 为什么onTimeSettedListener 在另一个方法中?
  • 它在 onCreate 中,就像在文档中一样
  • 什么文件?它可能在那里注册回调。
  • google官方文档以及其他网站
  • This page 看起来最相关,但它没有做任何事情。

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


【解决方案1】:

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

interface OnTimeSettedListener{
    fun onTimeSetListtedener(comic : String)
}

实际上,您并没有覆盖侦听器的方法。 OnTimeSettedListener 中的方法名称是 onTimeSetListtedener,但您正在覆盖 onTimeSettedListener,这在您的代码中并不存在。

正如@albodelu 提到的答案和@chris 在 cmets 中提到的,你不能在方法中编写方法。这是不正确的用法。

【讨论】:

  • 实际上,这只是 OnTimeSettedListener onTimeSetListtedener 类型的问题,现在纠正它就像一个魅力,我不明白我怎么没看到瘦。谢谢
【解决方案2】:

正如@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")
    }
}

更新

如果您修复名称拼写错误并删除片段内接口中@​​987654325@ 声明的默认实现,因为您的活动实现它并且Android Studio 会警告您缺少覆盖,您可以单击它并选择IDE 会为您实现它以避免错误:

interface OnTimeSettedListener{
    fun onTimeSettedListener(comic : String)
}

您还需要修复呼叫替换:

listener.onTimeSetListtedener("test")

通过

listener.onTimeSettedListener("test")

【讨论】:

  • 对不起,我刚刚检查了 android studio,实际上覆盖了 fun onTimeSettedListener(comic: String) 实际上在 onCreate 之外。我编辑我的问题
  • 您还需要将onTimeSetListtedener替换为onTimeSettedListener来覆盖它,否则“活动没有覆盖任何东西”的错误不会消失。
  • 是的,这是实际错误...当我更改了侦听器名称时,我忘记在活动中更改它
猜你喜欢
  • 2022-01-23
  • 2011-04-04
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多