如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?

Posted

技术标签:

【中文标题】如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?【英文标题】:How to have multiple views in fragment call the same onClick function declared in the fragment class? 【发布时间】:2021-01-04 07:37:32 【问题描述】:

我在一个片段中有大约 8 个不同的按钮,它们都应该调用相同的函数。我在 xml 中设置了他们的 tag 属性来调用该函数。我在片段类中声明了该函数,但在调用它时,应用程序崩溃并出现错误java.lang.IllegalStateException: Could not find method onTaskButtonClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatButton with id 'btn_playpause'

我发现我必须在托管片段的 Activity 中实现该功能。但是我想避免这种情况,因为 Activity 可能会承载 5 个以上的片段,如果所有片段功能都在该 Activity 中实现,它会变得太大,不符合我的喜好。

编辑

基本上,我想避免这种情况:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
    super.onViewCreated(view, savedInstanceState)
    btn_playpause.setOnClickListener  onTaskButtonClick(view) 
    btn_previous_track.setOnClickListener  onTaskButtonClick(view) 
    btn_next_track.setOnClickListener  onTaskButtonClick(view) 
    btn_volume_down.setOnClickListener  onTaskButtonClick(view) 
    btn_volume_up.setOnClickListener  onTaskButtonClick(view) 
    btn_mute.setOnClickListener  onTaskButtonClick(view) 


fun onTaskButtonClick(view: View) 
    presenter.onTaskButtonPressed(view.tag.toString())

在 xml 中让按钮指向该函数似乎更容易。

【问题讨论】:

如果您使用的是 lambda,那么您应该使用它而不是视图。 btn_playpause.setOnClickListener onTaskButtonClick(it) 感谢您的提示,但我仍然有所有这些重复的代码行。 【参考方案1】:

您可以使用可变参数。

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
    super.onViewCreated(view, savedInstanceState)
    setClickListenerOnViews(
        btn_playpause,
        btn_previous_track,
        btn_next_track,
        btn_volume_down,
        btn_volume_up,
        btn_mute
    )


private fun setClickListenerOnViews(vararg views: View) 
    views.forEach 
        it.setOnClickListener  presenter.onTaskButtonPressed(it.tag.toString()) 
    

【讨论】:

以上是关于如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?的主要内容,如果未能解决你的问题,请参考以下文章

日志片段,类中的Logfactory声明

Android - 多个视图或运行时片段替换​​?

如何让自定义视图观察包含片段的生命周期事件而不是活动?

在内部片段类中使用ListView

仅在父片段中的操作栏中显示搜索视图

android片段-当另一个片段被推到它上面时如何保存片段中的视图状态