Android 将片段中视图上的单击事件传递给活动

Android 将片段中视图上的单击事件传递给活动,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我试图将片段中视图上的单击事件传递给活动。我遵循的是来自的文档指南。 据我所知,我可能是错的,但我们需要创建一个接口,向其添加一个方法声明,并在片段上收到click事件时触发该方法。然后,活动应该实现片段中定义的接口,以便活动接收该事件 我有我的片段: class MoreFragment : Fragment() { internal var callback: OnMoreItemClickedListener fun setOnMoreItemClickedListen

我试图将
片段中视图上的单击事件传递给
活动
。我遵循的是来自的文档指南。 据我所知,我可能是错的,但我们需要创建一个接口,向其添加一个方法声明,并在片段上收到click事件时触发该方法。然后,活动应该实现片段中定义的接口,以便活动接收该事件

我有我的片段:

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
MoreFragment.kt:(16,5)
内部变量回调:OnMoreItemClickedListener
。上面的文档链接确实建议使用相同/类似的代码,但它不起作用

我尝试过的事情

  • 我已经尝试为
    回调:OnMoreItemClickedListener
    变量添加
    lateinit var
    ,但没有成功。因为它从未初始化过
  • 我放置
    内部变量回调:OnMoreItemClickedListener?=null
    并使用null安全运算符
    引用了
    回调
但无法获取单击事件
我对Kotlin和Fragments也是相当陌生的,所以请帮我想想如何做到这一点。谢谢

你的两条路看起来都不错

我已尝试为回调设置lateinit变量:

我把内部变量回调:OnMoreItemClickedListener= 空的

我想问题就在于调试下面的代码。如果

if(fragment is MoreFragment){
  fragment.setOnMoreItemClickedListener(this)
}

你的两边看起来都很好

我已尝试为回调设置lateinit变量:

我把内部变量回调:OnMoreItemClickedListener= 空的

我想问题就在于调试下面的代码。如果

if(fragment is MoreFragment){
  fragment.setOnMoreItemClickedListener(this)
}

在片段重写中使用TACH方法

private lateinit var callback: OnMoreItemClickedListener

    override onAttach(context : Context){
    callback  = context as OnMoreItemClickedListener
    }
那么您的回调将是init。因为奥纳塔克将是第一个。因此,不必初始化任何属性,否则将发生抽象错误


同样在活动中,实现您的接口(OnMoreItemClickedListener)并重写其方法。您将在片段覆盖法中得到回调

private lateinit var callback: OnMoreItemClickedListener

    override onAttach(context : Context){
    callback  = context as OnMoreItemClickedListener
    }
那么您的回调将是init。因为奥纳塔克将是第一个。因此,不必初始化任何属性,否则将发生抽象错误


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

嘿,我在那里放了一个
Log.d
,事实上,即使在bottonav上单击
MoreFragment
时,
片段(fragment:fragment)
也没有被调用。我猜导航架构组件不是这样工作的。你能建议一些解决方法吗?嘿,我在那里放了一个
Log.d
,事实上,即使在bottonav上单击
MoreFragment
,也不会调用
orachfragment(fragment:fragment)
。我猜导航架构组件不是这样工作的。您能建议一些解决方法吗?也不需要在活动中重写onAttachFragment()。同时删除此方法setOnMoreItemClickedListeneral,这样就不需要在活动中重写onAttachFragment()。同时删除此方法SetOnMoreItemClickedListener您的问题解决了吗?是@KishanMaurya,接受您的回答。谢谢你投赞成票?是的,确定@KishanMaurya你的问题解决了吗?是的@KishanMaurya,接受了你的回答。谢谢你投赞成票?是的当然了KishanMaurya