当前位置: 首页 > 知识库问答 >
问题:

将片段中视图上的click事件传递给活动

徐文彬
2023-03-14
class MoreFragment : Fragment() {

    internal var callback: OnMoreItemClickedListener

    fun setOnMoreItemClickedListener(callback: OnMoreItemClickedListener) {
        this.callback = callback
    }

    interface OnMoreItemClickedListener {
        fun onAddClothClicked()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_more, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
    }

    override fun onStart() {
        super.onStart()

        btn_add_clothes.setOnClickListener {
            callback.onAddClothClicked()
        }

    }
}
class MainActivity : AppCompatActivity(), MoreFragment.OnMoreItemClickedListener {

    override fun onAddClothClicked() {
        Log.d("MainActivity", "HERE")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_clothes,
                R.id.navigation_seasons,
                R.id.navigation_notifications,
                R.id.navigation_more
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    override fun onAttachFragment(fragment: Fragment) {
        super.onAttachFragment(fragment)

        if(fragment is MoreFragment){
            fragment.setOnMoreItemClickedListener(this)
        }
    }
}
MoreFragment.kt: (16, 5): Property must be initialized or be abstract

我尝试过的事情

  • 我尝试为回调变量:onmoreItemClickedListener放一个lateInit var,但没有成功。因为它永远不会被初始化。
  • 我将内部var回调:onmoreItemClickedListener?=null并使用null safe运算符引用了回调?。但无法获取click事件。

我是相当新的Kotlin和碎片太,所以请帮助我如何做到这一点。谢谢

共有1个答案

袁鹤轩
2023-03-14

在片段重写onAttach方法中

private lateinit var callback: OnMoreItemClickedListener

    override onAttach(context : Context){
    callback  = context as OnMoreItemClickedListener
    }

然后您的回调将是init。因为onAttach将是第一个。因此,没有属性必须初始化,否则将发生抽象错误。

同样,在活动中,实现您的接口(OnMoreItemClickedListener)并重写它的方法。你会得到回拨

 类似资料:
  • 问题内容: 我有一个外部面板,在外部面板上有另一个jPanel。 如果我在内部面板上单击鼠标右键,则应该执行外部面板的右键单击操作。如果我确实在内部面板上单击鼠标左键,则应该发生其自身内部面板的点击动作。 是否可以将点击事件从一个面板传递到另一面板? 问题答案: 要解决此问题,您需要解决许多问题。 首先是要了解鼠标事件与创建它的组件有关,尤其是位置信息。单击点是相对于源组件x / y位置的偏移量(

  • 当我关闭一个活动时,我希望它将一个值传递给另一个活动中的一个片段,我该怎么做? 活动B 片段A 代码不起作用,因为它给了我一个错误 谢啦

  • 问题内容: 在我的RCP应用程序中,左侧有一个用于导航的视图,右侧有一个用于视图的文件夹。透视图看起来像这样: 我想根据用户在导航树中选择的内容打开不同的视图。认为这并不难。我的导航树视图: 这似乎很好。仅有一个小问题:我需要以某种方式将对象(例如,selectedItem)传递给我的视图,以使用户与其内容进行交互。我怎么做? 我看到了一些示例,其中一些同事编写了自己的视图,并将其放置在右侧。然后

  • 问题内容: 我想创建一个应用程序,其中应处理某些事件,就像它们被传递到父容器一样。例如,我有一个包含的。顶部立即实现了鼠标按下和拖动。为了使事件看起来像是到达的,而不是标签本身,我需要做什么。(更改源对象很重要) 是否有比实际实现事件并在父级中复制事件更好的解决方案?(在某些对象> 5个孩子之后,这将变得乏味)。 问题答案: 在事件侦听器中,您可以将事件调度到父组件。 作为事件处理函数参数: 但是

  • 自己写的一个在不同搜索引擎间快速跳转的脚本,image的click事件无效。 把function单独粘贴到控制台运行是正常的,但是全部粘贴到控制台后图片的点击事件就没有生效,也没报错。。。询问chatgpt也没给出有效方案。