我在应用程序的多个活动中需要一些功能。他们需要能够访问Activity方法,并且在某些情况下需要覆盖方法(例如,我具有一些共享功能,可以从Gallery中选择需要处理onRequestPermissionsResult
的图片)。
其中任何一个都很简单-我可以创建一个XXXBase类,然后我的Activity可以从中继承。但是,如果我在Activity中需要这些功能中的一个以上,则受继承机制的限制。
我可以将所有这些额外的功能放在一个可以重复使用的通用基类中,但是该类最终可能变得很大而笨拙。
我是否缺少其他方法?我正在使用Kotlin,如果这样做会带来更多的可能性。
答案 0 :(得分:1)
鉴于您需要重写某些框架方法,我认为这对于使用无头Fragment
实际上是一个很好的例子。使用Fragment
,您可以启动Activity
,请求权限,处理结果等。使用此模式,可以将此Fragment
附加到任何Activity
(甚至另一个Fragment
小时候)。您当然可以细分无头Fragment
内部依赖的其他类,但是我绝对建议您研究基于Fragment
的方法。
例如:
private const val REQUEST_CODE_PERMISSION: Int = 1
class MyUtilityFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
if (savedInstanceState == null) {
// do permission request
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
): {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// handle your permission result here
}
}
然后在您的Activity
中,您可以将其附加在onCreate()
中,然后让它完成其工作:
class MyActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(MyUtilityFragment(), "utility_fragment")
.commitNow()
}
}
}
如果您需要将结果提供给主机,则只需在Fragment
中指定一个接口,并让托管父项Fragment
或Activity
实现该接口,然后在需要时从无头Fragment
检索它:
private fun getCallback() : MyCallbackInterface {
parentFragment?.takeIf { it is MyCallbackInterface }?.let { return it as MyCallbackInterface }
return requireActivity() as MyCallbackInterface
}