我有一个活动-> DashboardActivity我有一个超级活动-> MainActivity我有一个片段-> DashboardFragement
DashboardActivity扩展MainActivity,并且DashboardFragment从DashboardActivity加载
现在在我的片段中,我想使用通过接口进行回调,因此我的DashboardActivity还实现了一个在DashboardFragment中定义的接口,例如RefreshDashboard,并包含一个方法refresh()
签名:
class DashBoardActivity extends MainActivity implements RefreshDashboard
在片段的onAttach中,我这样做:
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is RefreshDashboard)
cont = context
}
稍后,我会执行以下操作:
cont.refresh()
有时此cont为null,因为它引用了父活动---> MainActivity,而我的主要活动未实现RefreshDashboard
有时,这很好用。
据我了解,它应该始终是子活动---> DashboardActivity
我在这里想念什么吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在你的描述中,问题可能出在Android的Fragment与Activity交互的生命周期管理上。特别是当Fragment被附加到不同的Activity实例时,可能会导致你遇到的问题。以下是一些可能的原因和解决建议:
确保DashboardFragment总是附加到DashboardActivity:
RefreshDashboard
接口的Activity上,你需要确保这种情形不会发生。可以通过在Fragment的构造函数或onAttach
方法中添加逻辑检查来强化这一点。使用安全调用模式:
cont.refresh()
之前,总是检查cont
是否为null。这样可以避免空指针异常。cont?.refresh()
利用泛型约束:
abstract class BaseFragment<T : Activity> : Fragment() {
protected lateinit var activityCallback: T
override fun onAttach(context: Context) {
super.onAttach(context)
activityCallback = context as T
}
}
class DashboardFragment : BaseFragment<DashboardActivity>() {
//...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 现在你可以安全地使用 activityCallback.refresh()
activityCallback.refresh()
}
}
这样做可以确保只有实现了所需接口的Activity才能作为宿主。
检查配置变化:
使用ViewModel进行通信:
综上所述,通过采用更严格的类型检查、安全调用模式以及可能的话,引入ViewModel来管理数据流和通信,可以有效避免此类问题的发生。