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